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

我有一个(SPARC)Solaris 10服务器与16G的RAM。 有超过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标志,应该分配多less? 根据这个页面 ,我不希望它尝试使用超过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 

你显然已经没有了交换空间。 你还有空闲RAM的事实是不相关的。 Solaris不会过度使用内存,所以所有的保留都必须由虚拟内存来支持。

看看swap -s输出来获取有关虚拟内存(aka swap)使用情况的信息。

我在solaris 10盒子上遇到了一个问题,这个盒子有很多物理内存和一个项目,允许我的应用程序用户打开相当多的进程并使用尽可能多的内存(计划在应用程序configuration中实现对资源的控制级别),事实certificate,java无法分配一个堆比我/ tmp中的可用空间更大,这个空间在我的特定设置中被安装在“swap”之外,有时允许更大的堆栈,有时允许更大的堆栈限制到几乎小于100米。 我还没有解决这个问题,但试验和错误(尝试堆的初始大小只是在/ tmp的可用空间之上或之下)我很确定下一步是稳定/ tmp挂载点。

您可能会限制每个进程的内存使用量。 IIRC,由ulimit设置的内存限制限制进程及其所有子进程的聚合内存使用量 如果您从shell中产生了多个JVM,则可能会超出shell子项的总聚合限制(如果设置了此类限制)。

尝试inputulimit -a,看看你有什么限制。

为了得到更多的细节,你可以在truss下启动java: truss java -version ( dtrace版本, dtruss ,是另一个不错的select)。

这将显示所有的java执行的系统调用。 最令人感兴趣的是在系统调用之前打印错误信息。 如果它是一个给ENOMEM的mmap(),我会再次考虑你的内存情况 – Solaris是否会受到内存碎片的影响?

我的直觉是它是文件; 如果以root身份运行其他几个进程或守护进程,则可能接近默认限制。

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

  $ /opt/java/jdk1.6.0_16/bin/java -version
 java版本“1.6.0_16”
 Java(TM)SE运行时环境(build 1.6.0_16-b01)
 Java HotSpot(TM)服务器虚拟机(构build14.2-b01,混合模式)

 $ /opt/java/jdk1.6.0_16/bin/java -d64 -version
 java版本“1.6.0_16”
 Java(TM)SE运行时环境(build 1.6.0_16-b01)
 Java HotSpot(TM)64位服务器虚拟机(构build14.2-b01,混合模式)