Java内存之谜(我有漏洞吗)?
我在linux服务器上运行一个独立的Java问题。我用-Xmx256m启动了jvm。我附加了一个JMX监视器,可以看到堆从未真正通过256Mb。但是,在我的linux系统上,当我运行top命令时,我可以看到: 1) 首先,该进程的RES内存使用量约为350Mb。为什么?我想这是因为堆外的内存 2) 其次,这个过程的VIRT内存使用量一直在增长。它永远不会停止!现在显示为2500Mb!那我是不是有漏洞?但堆并没有增加,它只是循环 最终,这会带来一个问题,因为系统的交换不断增长,最终系统会消亡 知道发生了什么事吗Java内存之谜(我有漏洞吗)?,java,linux,optimization,memory,heap,Java,Linux,Optimization,Memory,Heap,我在linux服务器上运行一个独立的Java问题。我用-Xmx256m启动了jvm。我附加了一个JMX监视器,可以看到堆从未真正通过256Mb。但是,在我的linux系统上,当我运行top命令时,我可以看到: 1) 首先,该进程的RES内存使用量约为350Mb。为什么?我想这是因为堆外的内存 2) 其次,这个过程的VIRT内存使用量一直在增长。它永远不会停止!现在显示为2500Mb!那我是不是有漏洞?但堆并没有增加,它只是循环 最终,这会带来一个问题,因为系统的交换不断增长,最终系统会消亡 知道
我想问的一个重要问题是,有哪些情况可能是我的代码导致的,而不是JVM、内核等。例如,如果线程数量不断增加,这是否符合我观察结果的描述?你能建议我注意一下类似的事情吗?听起来你好像有漏洞。您不能进行分析以查看哪个函数正在提升内存吗?但是我不确定。如果我不得不冒险,我会说您使用的JVM存在内存泄漏。将Sun与IBM JVM交换以进行测试
-XX:MaxPermSize=
控制)最后,您应该使用
ulimit
使系统更早失败,这样您就可以轻松地重复测试。一些潜在问题:
- 直接分配的缓冲区和内存映射文件是在Java堆之外分配的,不能方便地进行处置
- 为每个新线程保留一个堆栈区域
- 永久生成(代码和插入的字符串)在通常的堆栈之外。类加载器泄漏可能是一个问题(通常在重新加载webapps时)
- C堆可能正在泄漏
pmap-x
应该显示您的内存是如何消失的。WRT#1,RSS比堆大是正常的。这是因为
第二,是的,听起来你好像有什么漏洞。如果系统本身崩溃,则可能会消耗过多的系统资源,如套接字、线程或文件
尝试使用lsof查看JVM打开了哪些文件。随着内存的增加,请运行几次。如果JVM崩溃,请确保设置该选项。根据我的经验,Java中非堆内存泄漏的最常见原因是线程泄漏
您可能会发现一个有用的工具是,它可以让您实时监控堆大小、线程数和其他指标。java版本“1.6.0_13”java(TM)SE运行时环境(build 1.6.0_13-b03)java HotSpot(TM)64位服务器虚拟机(build 11.3-b02,混合模式)在我的pmap-x中基本上有一个很长的列表。有什么想法吗?我有一个类似的问题和相同的输出。原来是为新线程分配的堆栈空间。(我的螺纹漏了)