Java内存之谜(我有漏洞吗)?

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!那我是不是有漏洞?但堆并没有增加,它只是循环 最终,这会带来一个问题,因为系统的交换不断增长,最终系统会消亡 知道

我在linux服务器上运行一个独立的Java问题。我用-Xmx256m启动了jvm。我附加了一个JMX监视器,可以看到堆从未真正通过256Mb。但是,在我的linux系统上,当我运行top命令时,我可以看到:

1) 首先,该进程的RES内存使用量约为350Mb。为什么?我想这是因为堆外的内存

2) 其次,这个过程的VIRT内存使用量一直在增长。它永远不会停止!现在显示为2500Mb!那我是不是有漏洞?但堆并没有增加,它只是循环

最终,这会带来一个问题,因为系统的交换不断增长,最终系统会消亡

知道发生了什么事吗



我想问的一个重要问题是,有哪些情况可能是我的代码导致的,而不是JVM、内核等。例如,如果线程数量不断增加,这是否符合我观察结果的描述?你能建议我注意一下类似的事情吗?

听起来你好像有漏洞。您不能进行分析以查看哪个函数正在提升内存吗?但是我不确定。

如果我不得不冒险,我会说您使用的JVM存在内存泄漏。

将Sun与IBM JVM交换以进行测试
  • RES将包括代码+非头部数据。另外,有些您认为应该存储在堆中的东西不是,例如线程堆栈和“类数据”。(这是一个定义问题,但代码和类数据由
    -XX:MaxPermSize=
    控制)

  • 这听起来像是JVM实现、linux内核或库JNI代码中的内存泄漏

  • 如果使用Sun JVM,请尝试IBM,反之亦然

    我不确定dlopen到底是如何工作的,但如果可能的话,访问系统库的代码可能会重复映射相同的内容


    最后,您应该使用
    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中基本上有一个很长的列表。有什么想法吗?我有一个类似的问题和相同的输出。原来是为新线程分配的堆栈空间。(我的螺纹漏了)