java - 没有对象数量或大小增加的内存泄漏

标签 java memory-leaks ibm-midrange j9

在 IBM iSeries 系统上,我正在运行一个 Java 程序 - 一个带有 Web 服务器组件的应用程序服务器,所有这些都是内部开发的。在 32 位或 64 位 J9 JVM(IBM Technology for Java)上运行时,我有内存泄漏的症状。

请注意,在 iSeries 经典 JVM、多个 Sun/Oracle JVM 和 Linux JVM 上运行该软件不会出现任何问题。哎呀,当我在我的网站上工作时,我经常让相同的软件在我妻子的入门级笔记本电脑上运行数周 - 我可以向你保证,如果它泄漏内存,它会在那个东西上被注意到。

如果我只是让一个普通的系统闲置,没有配置任何应用程序(基本上只有消息传递系统和 Web 服务器),堆只会继续缓慢增长,导致随着时间的推移分配更多内存,每个GC 周期没有完全收集到上一个级别。对于没有问题的 JVM,该模式完全相同,除了那些 GC 扫描总是将堆减少到其先前的 GC 级别。

enter image description here

但是,如果我在稳定后启动 JVM 系统转储并在分配的堆显着增长后进行后续转储,则差异比较表明运行一周后的可访问对象比启动时更多。最近的一个,在一周后显示加载了 6 个附加类和一些与之明显相关的对象。对所有活体的彻底审查没有发现任何让我感到意外的事情。

我已经尝试过优化吞吐量和分代并发垃圾收集器。

所以根据作业的堆大小,我们似乎在泄漏,根据堆转储,没有任何泄漏。

没有被调用的 JNI 方法(除了作为核心 JVM 的一部分运行的 native 代码),而且肯定是堆在增长 - 我可以在 IBM WRKJVMJOB 信息以及使用 JMX bean 的报告中清楚地看到这一点在我的控制台日志文件中。

到目前为止,我无法使用 JVisualVM 之类的 JMX 工具连接到 Activity JVM,因为尽管在正确配置时会创建监听套接字,但连接被拒绝,显然是在协议(protocol)级别(TCP/IP 堆栈显示已接受连接,但 JVM 会反弹它)。

我很困惑,不知道下一步该去哪里。

编辑:只是为了澄清;这些结果都是使用未检测的 JVM,因为我无法通过 JMX 访问此 JVM(我们正在与 IBM 合作)。

编辑 2011-11-16 19:27:我能够提取超过 1823 个 GC 周期的 GC Activity 报告,其中包括 Soft/Weak/PhantomReference 计数的特定计数;这些数字没有出现失控增长的迹象。然而,小对象永久空间有显着增长(大对象永久空间是空的)。它从 9M 增长到 36M。

最佳答案

在我的程序中消除了一些粗心的内存浪费(尽管没有任何泄漏),并针对我们的工作负载更好地调整了 GC,我已将失控的内存使用降低到可容忍的水平。

但是,在此过程中,我已经证明在 AS/400(又名 iSeries、Systemi、i5 等)上使用的 IBM J9 JVM 有 1336 字节/分钟的泄漏,总计 2 MB/天。从“单线”测试程序一直到我们的应用程序服务器,我可以通过各种程序观察到这种泄漏。

单行测试程序是这样的:

public class ZMemoryLeak2
extends Object
{

static public synchronized void main(String... args) {
    try { ZMemoryLeak2.class.wait(0); } catch(InterruptedException thr) { System.exit(0); }
    }

}

一个单独的测试程序除了通过 JMX API 监控内存使用之外什么都不做,最终表明 1336 B 恰好每隔 1 分钟泄漏一次,永远不会被回收(好吧,运行 2 周后不会回收)。 OP 注意:实际上每个 JVM 变体的数量略有不同。

2012-04-02 更新:这在几周前被 IBM 接受为错误;它实际上是在去年年中左右在 Java 5 中发现并修补的,Java 6 的补丁预计将在未来一两周内发布。

关于java - 没有对象数量或大小增加的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8145913/

相关文章:

c# - IIS 7.5 将反向希伯来语写入 AS/400,而 IIS Express 不会

java - 客户端访问 AS400 Java 包装器

无法使用Acceleo调用Java服务

java - 在 LDAP 中搜索向同一经理报告的用户

java - 如果重置回调,为什么Android会由于静态Drawable而泄漏内存?

scala - 避免 Scala 内存泄漏 - Scala 构造函数

actionscript-3 - 您能期望 flash/as3 播放器最终进行垃圾收集吗?

java - 跳棋棋步生成的递归有什么问题?

java - IncorrectResultSetColumnCountException : Incorrect column count: expected 1, 实际 38

DB2 版本的 SQL 差异