微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux上的Java内存使用情况

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

我正在设置-Xmx450m -XX:MaxPermSize = 192m参数来控制堆和permgen的增长量。 这些设置适用于所有Java应用程序服务器上的所有Tomcat实例,共约70个Tomcat实例。

以下是Psi-probe报告的那些Tomcat实例之一的典型内存使用情况

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

然而,CentOS在707M(根据RSS)报告了这个特定进程的内存使用情况,这导致了170M的内存不被使用。

你如何确定C ++中的Linux系统RAM的数量

mmap系统调用中MAP_ANONYMOUS标志的用途是什么?

如何将虚拟内存地址转换为物理地址?

Windbg ethread – IrpList位置

如何使用linux内核中的内存屏障

我知道,JVM本身和它的一些依赖库必须加载到内存中,所以我决定启动pmap -d来查找它们的内存占用情况。 据我的计算,约占17M。

接下来是32位JVM for Linux上的每个线程320k的Java线程堆栈。 同样,我使用Psi-probe来计算特定JVM上的线程数,总数为129个线程。 所以129 + 320k = 42M

我读过NIO使用堆外的内存,但我们不在我们的应用程序中使用NIO。

所以在这里,我已经计算了所有关于(我的)头脑的事情。 而我只占了“失踪”170M的六千万。

我错过了什么?

内存分析 – VAD标签代码注入

提升mmap性能与原生内存映射

C ++保留内存空间

Linux命令的百分比是免费的内存

Linux OOM杀手和Java进程

尝试使用增量垃圾收集器,使用-Xincgc命令行选项。 在整个GC工作中,它更具侵略性,并且有一个特别的快乐的小异常:它实际上将一些未使用的内存交还给操作系统,这与认和其他GC选择不同! 这使得JVM消耗更少的内存,如果你在一台机器上运行多个JVM的话,这是非常好的。 牺牲一些性能 – 但你可能没有注意到它。 这个incgc似乎有些小小的秘密,因为没有人把它提起来……它已经在那里,甚至九十年代了。

Arnar,在JVM初始化过程中,JVM将分配由-Xmx和MaxPermSize指定大小的内存(mmap或malloc),因此无论如何JVM将在JVM进程启动时为应用程序分配450 + 192 = 642m的堆空间。 所以Java应用程序的堆空间不是537,而是642m.so现在,如果你做了这个计算,它会给你缺少的内存。希望它有帮助。

Java分配尽可能多的虚拟内存,然而驻留端将是你实际使用的多少。 注意:许多库和线程都有自己的头脑,虽然你不使用直接内存,但并不意味着底层系统没有。 例如,如果您使用NIO,即使您使用堆ByteBuffers,也会使用一些直接内存。

最后,100 MB价值约8英镑。 这可能是不值得花太多时间担心的。

不是一个直接的答案,但是,你是否也考虑过在同一个Tomcat实例中托管多个站点 ? 这可以节省一些额外配置的代价。

Arnar,JVM也是mmap所有正在使用的jar文件,它们将使用NIO并且将会为RSS做出贡献。 我不相信这些是在你上面的任何测量。 你偶然有大量的大型jar文件? 如果是这样,用于这些页面可能是你的缺失记忆。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐