Java在Linux上的内存使用情况。

26 浏览
0 Comments

Java在Linux上的内存使用情况。

我运行了一些Java应用服务器,它们都在CentOS 5.5 Linux上运行最新版本的Tomcat 6和Sun的Java 6。每个服务器运行多个Tomcat实例。

我设置了-Xmx450m -XX:MaxPermSize=192m参数来控制堆和永久代的大小。这些设置适用于所有Java应用服务器上的所有Tomcat实例,总共约70个Tomcat实例。

以下是Psi-probe报告的其中一个Tomcat实例的典型内存使用情况:

Eden           = 13M
Survivor       = 1.5M 
Perm Gen       = 122M 
Code Cache     = 19M 
Old Gen        = 390M 
Total          = 537M

然而,CentOS报告这个特定进程的RAM使用量为707M(根据RSS),留下了170M的RAM没有解释。

我知道JVM本身和一些它依赖的库必须加载到内存中,因此我决定启动pmap -d来查找它们的内存占用。

根据我的计算,这占用了大约17M的内存。

接下来是Java线程堆栈,对于32位的Linux JVM,每个线程的大小为320k。再次使用Psi-probe计算该特定JVM上的线程数量,总共有129个线程。因此,129 + 320k = 42M。

我已经阅读过NIO在堆之外使用内存,但我们的应用程序中没有使用NIO。

所以我已经计算了所有我能想到的东西。我只能解释那170M中的60M。

我漏掉了什么?

admin 更改状态以发布 2023年5月22日
0
0 Comments

Arnar,在JVM初始化过程中,JVM将分配一个大小由-Xmx和MaxPermSize指定的内存(mmap或malloc),因此无论如何,JVM将在JVM进程开始时为应用程序分配450 + 192 = 642m的堆空间。因此,应用程序的Java堆空间不是537,而是642m。所以现在如果你计算一下,就可以得出你缺失的内存。希望能有所帮助。

0
0 Comments

尝试使用增量垃圾收集器,使用-Xincgc命令行选项。
它在整个GC努力方面更加积极,并具有一个特殊的快乐小异常:它实际上会将一些未使用的内存返还给操作系统,而不像默认和其他GC选择!
这使得JVM消耗的内存大大减少,如果您在一台机器上运行多个JVM,特别是好处很大。以某些性能为代价-但您可能不会注意到它。incgc似乎是一个小秘密,因为没有人提起过它……它已经存在了很长时间(甚至是90年代)。

0