我目前在运行 Java 时遇到了一些问题。由于堆问题,它不会启动。但是我有超过 9 GB 的可用内存(如果您认为缓存是空的,甚至是 16 GB)。这是我得到的错误(和free
命令)
root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # free
total used free shared buffers cached
Mem: 25165824 15941148 9224676 0 0 7082176
-/+ buffers/cache: 8858972 16306852
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
我在虚拟化服务器上运行 64 位 Debian。虚拟化软件是 OpenVZ。这是我的 Java 版本(我可以在停止两个 VM(当前正在运行的 4 个)后执行此命令):
root@server: ~ # java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Run Code Online (Sandbox Code Playgroud)
我能做什么?
按照要求:
root@server: ~ # cat /proc/meminfo
MemTotal: 25165824 kB
MemFree: 11723412 kB
Cached: 4597552 kB
Active: 9692308 kB
Inactive: 3322544 kB
Active(anon): 7411960 kB
Inactive(anon): 1005340 kB
Active(file): 2280348 kB
Inactive(file): 2317204 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 960 kB
Writeback: 0 kB
AnonPages: 8417300 kB
Shmem: 21504 kB
Slab: 427452 kB
SReclaimable: 383424 kB
SUnreclaim: 44028 kB
Run Code Online (Sandbox Code Playgroud)
客人2:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399250512 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005602 6291447 6291456 6291456 221
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4634494 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529371 2144671 6291456 9223372036854775807 0
numtcpsock 62 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3330352 4153232 1179110194 1684441906 0
tcprcvbuf 1216896 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4766 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399246622 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005601 6291447 6291456 6291456 233
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
numtcpsock 64 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3365232 4153232 1179110194 1684441906 0
tcprcvbuf 1249664 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4768 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 10
该failcnt
是在往上走privvmpages
,所以你的容器是无法分配从主机中的任何更多的虚拟内存空间:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
privvmpages 6005601 6291447 6291456 6291456 >233<
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
Run Code Online (Sandbox Code Playgroud)
请注意,虚拟内存!= 物理内存。进程最多可以分配大约可寻址数量的虚拟内存(32 位 ~ 2G - 4G,64 位 8 TB - 256 TB),但这并不意味着正在使用物理内存页面(页面是 4KB 内存块)。
physpages
是容器可以使用的物理内存页数。
oomguarpages
是当主机内存受限时容器将收到的保证内存页面。
privvmpages
是您的容器可以使用的虚拟内存页数
vmguarpages
是以相同方式保证的虚拟内存量
Oracle Java 将始终分配一个连续的虚拟内存块。java
在盒子上不带参数运行会导致使用了 5M 的实内存 ( RSS
),但分配了 660M 的 VM 空间 ( VSZ
):
PID COMMAND VSZ RSS
20816 java 667496 4912
Run Code Online (Sandbox Code Playgroud)
查看文件中java
进程的内存段smaps
显示分配了大约 500MB 的块,其余的是内存映射文件和普通的 java 内容。
在已启动一段时间的系统上,可用 VM 空间会随着进程使用/释放其中的一部分而变得碎片化。Agrep Vmalloc /proc/meminfo
将为您VmallocChunk
提供当前可用的最大空闲块。如果这是低的,系统将尝试分配更多java
请求,毕竟在 64 位机器上它实际上是无限的。
告诉你的主机配置privvmpages
和vmguarpages
更高。它们不需要与物理内存相同,因为这会影响linux 内存的工作方式
您可以通过删除文件缓存来暂时解决该问题,echo 1 > /proc/sys/vm/drop_caches
但这只是暂时的。
您可以限制内存块java
尝试在运行时分配的最小值Xms
或运行时的最大值Xmx
。java
在我的机器上使用这些选项运行:
java -Xms10M -Xmx10M
Run Code Online (Sandbox Code Playgroud)
将总虚拟大小减少到 140MB 左右,只为 Java 堆分配了 10MB 的连续块。
小智 7
在我们的例子中,它有助于限制 VM 在启动时尝试保留的堆大小。
例如在命令行上:
出口 _JAVA_OPTIONS='-Xms64M -Xmx128m'
或用于 [TOMCAT_HOME]/bin/setenv.sh 中的 Tomcat
#!/bin/sh
JAVA_OPTS="-Xms64M -Xmx256M"
(注意命令行上额外的前导下划线。)
我们提供者的解释是: