Linux/Debian Java 内存问题
Linux/Debian Java Memory issue
你好 Whosebug 社区,
我的 vServer(由 https://host-unlimited.de/ 托管)有问题。
我将创建一个 Minecraft 服务器网络(使用 MySQL-Server、TeamSpeak³ 和 apache2-Website)
我的问题是 Java 说:
> java -jar spigot.jar
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /cloud/temporary/GunGame-1/hs_err_pid2734.log
但是服务器有足够的空闲内存:
> free -m
total used free shared buffers cached
Mem: 24336 5456 18879 256 0 923
-/+ buffers/cache: 4533 19802
Swap: 0 0 0
HTOP(来自"apt-get install htop"):
> htop
http://prntscr.com/fca7we
LSHW(lshw -html):
srv46374
description: Computer
width: 64 bits
capabilities: vsyscall64 vsyscall32
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 23GiB
*-cpu
product: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
width: 64 bits
capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
提前致谢!
//编辑:Java 错误日志(hs_err_XXX):https://pastebin.com/bkBFKY9Q
//编辑:ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515535
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
//编辑:
> java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
//编辑:
> sysinfo
------------------ Java Information ------------------
Java Version: 1.8.0_131
Java Vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Java classpath: /usr/lib/jvm/java-8-oracle/db/lib/derby.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbynet.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbytools.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbyoptionaltools.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbyclient.jar
OS name: Linux
OS architecture: amd64
OS version: 2.6.32-openvz-042stab123.2-amd64
Java user name: root
Java user home: /root
Java user dir: /cloud/temporary/GunGame-1
java.specification.name: Java Platform API Specification
java.specification.version: 1.8
java.runtime.version: 1.8.0_131-b11
--------- Derby Information --------
[/usr/lib/jvm/java-8-oracle/db/lib/derby.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbytools.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbynet.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbyclient.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbyoptionaltools.jar] 10.11.1.2 - (1629631)
------------------------------------------------------
----------------- Locale Information -----------------
Current Locale : [English/United States [en_US]]
Found support for locale: [cs]
version: 10.11.1.2 - (1629631)
Found support for locale: [de_DE]
version: 10.11.1.2 - (1629631)
Found support for locale: [es]
version: 10.11.1.2 - (1629631)
Found support for locale: [fr]
version: 10.11.1.2 - (1629631)
Found support for locale: [hu]
version: 10.11.1.2 - (1629631)
Found support for locale: [it]
version: 10.11.1.2 - (1629631)
Found support for locale: [ja_JP]
version: 10.11.1.2 - (1629631)
Found support for locale: [ko_KR]
version: 10.11.1.2 - (1629631)
Found support for locale: [pl]
version: 10.11.1.2 - (1629631)
Found support for locale: [pt_BR]
version: 10.11.1.2 - (1629631)
Found support for locale: [ru]
version: 10.11.1.2 - (1629631)
Found support for locale: [zh_CN]
version: 10.11.1.2 - (1629631)
Found support for locale: [zh_TW]
version: 10.11.1.2 - (1629631)
------------------------------------------------------
------------------------------------------------------
//编辑:
cat /proc/meminfo
MemTotal: 24920064 kB
MemFree: 23222156 kB
Cached: 1002468 kB
Buffers: 0 kB
Active: 716736 kB
Inactive: 686892 kB
Active(anon): 103684 kB
Inactive(anon): 297476 kB
Active(file): 613052 kB
Inactive(file): 389416 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 401160 kB
Shmem: 264064 kB
Slab: 30204 kB
SReclaimable: 16952 kB
SUnreclaim: 13252 kB
根据您的日志,您使用的是 32 位Java。因此存在进程大小受限的问题。
请切换到 64 位。
看起来您可能正在使用 32 位 java,请尝试清除所有这些,以找出所有 java 安装的作用:
dpkg -l java*
然后清除它们,
sudo apt purge java*
对于来自 apt use 的包(对于特定包,通配符 * 有效):
apt list --installed <package>
对于整个列表:
apt list --installed
也许
sudo apt purge jdk*
也一样,然后直接从 oracle 的网站重新安装 java,或者将 repo 添加到 apt。
如果这不起作用,请更改 ram Java 可以使用的数量,因为这也可能是问题所在,因为 jvm 始终限制在最大值。
第一个预感
你给了你的 JVM 多少堆?你完全限制它吗?
尝试 运行nig 以下命令:
java -XX:+PrintFlagsFinal -version | grep Heap
... 并找到诸如 HeapSizePerGCThread、InitialHeapSize 和 MaxHeapSize 之类的内容以查看内容您的 JVM 在您的特定部署中声明为默认值。
然后尝试将其与 # ulimit -a
的结果结合起来。希望您能找到您的 JVM 超出的一些限制,在这种情况下,只需向命令行添加适当的标志以稍微控制 JVM。
第二个(更详细的)预感
在您的日志中我们看到:CPU:total 32 (initial active 8) (8 cores per cpu, 2 threads per core)
- 不错的机器!
问题是 Java 在启动时看到了多少个处理器。 /proc/cpuinfo
列出了 8 个处理器,但每个处理器都有 16 个兄弟(超线程)。
如果你能先运行非常简单class,你就能准确地找出:
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
}
我很感激即使这个 class 也可能无法启动...如果我的理论是正确的 运行 它按照以下命令行:
java --XX:ParallelGCThreads=2 com.test.HowManyProcessors
...最后一个参数就是那个简单的 class' 名称。
如果它 运行s,那么我们就在正确的轨道上,它会告诉你有多少处理器 Java 可以玩。
如果这个数字很大,请尝试像这样开始 Java:
java -XX:ParallelGCThreads=<a_number_of_gc_threads> -jar spigot.jar
默认情况下,如果处理器数量 N <= 8,那么并行 GC 将使用同样多的处理器。对于 N > 8 个可用处理器,GC 线程数将计算为 3+5N/8。
因此,如果您的机器提供 Java 多个 CPU 供使用,Java 完全有可能尝试启动相当少的线程来进行 GC,这可能会达到平台限制并产生令人惊讶的结果在 insufficient memory - can't create GC thread
。
希望对您有所帮助!
你好 Whosebug 社区,
我的 vServer(由 https://host-unlimited.de/ 托管)有问题。
我将创建一个 Minecraft 服务器网络(使用 MySQL-Server、TeamSpeak³ 和 apache2-Website)
我的问题是 Java 说:
> java -jar spigot.jar
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /cloud/temporary/GunGame-1/hs_err_pid2734.log
但是服务器有足够的空闲内存:
> free -m
total used free shared buffers cached
Mem: 24336 5456 18879 256 0 923
-/+ buffers/cache: 4533 19802
Swap: 0 0 0
HTOP(来自"apt-get install htop"):
> htop
http://prntscr.com/fca7we
LSHW(lshw -html):
srv46374
description: Computer
width: 64 bits
capabilities: vsyscall64 vsyscall32
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 23GiB
*-cpu
product: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
width: 64 bits
capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
提前致谢!
//编辑:Java 错误日志(hs_err_XXX):https://pastebin.com/bkBFKY9Q
//编辑:ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515535
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
//编辑:
> java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
//编辑:
> sysinfo
------------------ Java Information ------------------
Java Version: 1.8.0_131
Java Vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Java classpath: /usr/lib/jvm/java-8-oracle/db/lib/derby.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbynet.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbytools.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbyoptionaltools.jar:/usr/lib/jvm/java-8-oracle/db/lib/derbyclient.jar
OS name: Linux
OS architecture: amd64
OS version: 2.6.32-openvz-042stab123.2-amd64
Java user name: root
Java user home: /root
Java user dir: /cloud/temporary/GunGame-1
java.specification.name: Java Platform API Specification
java.specification.version: 1.8
java.runtime.version: 1.8.0_131-b11
--------- Derby Information --------
[/usr/lib/jvm/java-8-oracle/db/lib/derby.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbytools.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbynet.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbyclient.jar] 10.11.1.2 - (1629631)
[/usr/lib/jvm/java-8-oracle/db/lib/derbyoptionaltools.jar] 10.11.1.2 - (1629631)
------------------------------------------------------
----------------- Locale Information -----------------
Current Locale : [English/United States [en_US]]
Found support for locale: [cs]
version: 10.11.1.2 - (1629631)
Found support for locale: [de_DE]
version: 10.11.1.2 - (1629631)
Found support for locale: [es]
version: 10.11.1.2 - (1629631)
Found support for locale: [fr]
version: 10.11.1.2 - (1629631)
Found support for locale: [hu]
version: 10.11.1.2 - (1629631)
Found support for locale: [it]
version: 10.11.1.2 - (1629631)
Found support for locale: [ja_JP]
version: 10.11.1.2 - (1629631)
Found support for locale: [ko_KR]
version: 10.11.1.2 - (1629631)
Found support for locale: [pl]
version: 10.11.1.2 - (1629631)
Found support for locale: [pt_BR]
version: 10.11.1.2 - (1629631)
Found support for locale: [ru]
version: 10.11.1.2 - (1629631)
Found support for locale: [zh_CN]
version: 10.11.1.2 - (1629631)
Found support for locale: [zh_TW]
version: 10.11.1.2 - (1629631)
------------------------------------------------------
------------------------------------------------------
//编辑:
cat /proc/meminfo
MemTotal: 24920064 kB
MemFree: 23222156 kB
Cached: 1002468 kB
Buffers: 0 kB
Active: 716736 kB
Inactive: 686892 kB
Active(anon): 103684 kB
Inactive(anon): 297476 kB
Active(file): 613052 kB
Inactive(file): 389416 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 401160 kB
Shmem: 264064 kB
Slab: 30204 kB
SReclaimable: 16952 kB
SUnreclaim: 13252 kB
根据您的日志,您使用的是 32 位Java。因此存在进程大小受限的问题。
请切换到 64 位。
看起来您可能正在使用 32 位 java,请尝试清除所有这些,以找出所有 java 安装的作用:
dpkg -l java*
然后清除它们,
sudo apt purge java*
对于来自 apt use 的包(对于特定包,通配符 * 有效):
apt list --installed <package>
对于整个列表:
apt list --installed
也许
sudo apt purge jdk*
也一样,然后直接从 oracle 的网站重新安装 java,或者将 repo 添加到 apt。
如果这不起作用,请更改 ram Java 可以使用的数量,因为这也可能是问题所在,因为 jvm 始终限制在最大值。
第一个预感
你给了你的 JVM 多少堆?你完全限制它吗? 尝试 运行nig 以下命令:
java -XX:+PrintFlagsFinal -version | grep Heap
... 并找到诸如 HeapSizePerGCThread、InitialHeapSize 和 MaxHeapSize 之类的内容以查看内容您的 JVM 在您的特定部署中声明为默认值。
然后尝试将其与 # ulimit -a
的结果结合起来。希望您能找到您的 JVM 超出的一些限制,在这种情况下,只需向命令行添加适当的标志以稍微控制 JVM。
第二个(更详细的)预感
在您的日志中我们看到:CPU:total 32 (initial active 8) (8 cores per cpu, 2 threads per core)
- 不错的机器!
问题是 Java 在启动时看到了多少个处理器。 /proc/cpuinfo
列出了 8 个处理器,但每个处理器都有 16 个兄弟(超线程)。
如果你能先运行非常简单class,你就能准确地找出:
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
}
我很感激即使这个 class 也可能无法启动...如果我的理论是正确的 运行 它按照以下命令行:
java --XX:ParallelGCThreads=2 com.test.HowManyProcessors
...最后一个参数就是那个简单的 class' 名称。
如果它 运行s,那么我们就在正确的轨道上,它会告诉你有多少处理器 Java 可以玩。 如果这个数字很大,请尝试像这样开始 Java:
java -XX:ParallelGCThreads=<a_number_of_gc_threads> -jar spigot.jar
默认情况下,如果处理器数量 N <= 8,那么并行 GC 将使用同样多的处理器。对于 N > 8 个可用处理器,GC 线程数将计算为 3+5N/8。
因此,如果您的机器提供 Java 多个 CPU 供使用,Java 完全有可能尝试启动相当少的线程来进行 GC,这可能会达到平台限制并产生令人惊讶的结果在 insufficient memory - can't create GC thread
。
希望对您有所帮助!