即使有足够的 RAM,Java“无法为对象堆保留足够的空间”

Bra*_*one 8 debian java ram

我目前在运行 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

OpenVZ 和内存

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 位机器上它实际上是无限的。

使固定

告诉你的主机配置privvmpagesvmguarpages更高。它们不需要与物理内存相同,因为这会影响linux 内存的工作方式

您可以通过删除文件缓存来暂时解决该问题,echo 1 > /proc/sys/vm/drop_caches但这只是暂时的。

您可以限制内存块java尝试在运行时分配的最小值Xms或运行时的最大值Xmxjava在我的机器上使用这些选项运行:

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"

(注意命令行上额外的前导下划线。)

我们提供者的解释是:

  • java VM 在启动时计算初始堆大小
  • 此计算基于可用的 RAM。
  • 在计算初始堆大小时,虚拟专用服务器 (VPS) 上的某些 java 安装无法反映 VPS 的内存限制。相反,他们根据托管系统的内存大小进行计算。这可能会导致 VPS 上不可用的大量可用内存。
  • 当通过 JAVA_OPTS 提供初始堆大小时,VM 使用这些值并且不会尝试自行计算。