Java 在我的 Solaris 服务器上遇到什么资源限制?

Java 在我的 Solaris 服务器上遇到什么资源限制?

我有一台 (sparc) Solaris 10 服务器,内存为 16G。还有超过 4G 的可用空间。

Memory: 16G phys mem, 4371M free mem, 8193M swap, 8193M free swap

我正在运行许多 Java 进程(我使用 32 位 JVM,因为它们都不需要大量内存),并且想运行另一个进程。但它声称内存不足。

# /usr/jdk/jdk1.6.0_17/bin/java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap

我尝试使用减小的内存池最大大小 (-Xmx) 运行。然后我逐渐增加上限,直到它确实非常高。如果没有 -Xmx 标志,它应该分配多少?根据这一页,我不希望它尝试使用超过 1G 的空间。但我可以将其使用量增加三倍以上而不会出现错误。

# /usr/jdk/jdk1.6.0_17/bin/java -Xmx3900m -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Server VM (build 14.3-b01, mixed mode)

如果我将其提高到该水平之上,那么我就会开始收到其他错误,但我希望如此,因为无论如何我都接近 32 位进程的地址空间 4G 限制。

这里可能发生什么事情?我该如何自己诊断? 编辑:大多数 java 进程都以不同的用户身份运行(每个用户不超过 10 个)。但请注意,上面我正尝试以 root 身份启动新进程(仅仅是“java -version”)。

# ulimit -a
core file size        (blocks, -c) unlimited
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
open files                    (-n) 256
pipe size          (512 bytes, -p) 10
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 29995
virtual memory        (kbytes, -v) unlimited

答案1

显然,您的交换空间已用完。您仍有可用 RAM 这一事实与此无关。Solaris 不会过度使用内存,因此所有预留空间都必须由虚拟内存支持。

查看swap -s输出以获取有关虚拟内存(又名交换)使用情况的信息。

答案2

我在具有大量物理内存的 solaris 10 机器上遇到了一个问题,并且有一个项目允许我的应用程序用户打开几乎尽可能多的进程并使用尽可能多的内存(计划在应用程序配置级别实现对资源的控制),结果是 java 无法分配大于 /tmp 中可用空间的堆,在我的特定设置中,/tmp 安装在“交换”之外,有时会波动,允许更大的堆,有时将其限制在几乎不到 100m。我还没有解决这个问题,但通过反复试验(尝试将堆初始大小设置为略高于或低于 /tmp 可用空间),我很确定下一步是使 /tmp 挂载点稳定。

答案3

您可能对每个进程的内存使用量有限制。如果我没记错的话,ulimit 设置的内存限制会限制进程的总体内存使用量及其所有子项。 如果您从 shell 生成了多个 JVM,则可能会超出该 shell 子进程的总聚合限制(如果设置了此类限制)。

尝试输入 ulimit -a 来查看您强制实施的限制。

答案4

Solaris 默认调用 32 位 JVM,如果将 -d64 作为第一个 JVM 参数,它将调用 JVm 的 sparcv9(64 位)版本。

$ /opt/java/jdk1.6.0_16/bin/java -版本
Java 版本“1.6.0_16”
Java(TM) SE 运行时环境(版本 1.6.0_16-b01)
Java HotSpot(TM) Server VM(版本 14.2-b01,混合模式)

$ /opt/java/jdk1.6.0_16/bin/java -d64 -版本
Java 版本“1.6.0_16”
Java(TM) SE 运行时环境(版本 1.6.0_16-b01)
Java HotSpot(TM) 64 位服务器 VM(版本 14.2-b01,混合模式)

相关内容