Law*_*Dol 23 java memory-leaks j9 ibm-midrange
在IBM iSeries系统上,我运行了一个Java程序 - 一个带有Web服务器组件的应用程序服务器,所有这些都是内部开发的.在32位或64位J9 JVM(IBM Technology for Java)上运行时,我有内存泄漏的症状.
请注意,在iSeries经典JVM,多个Sun/Oracle JVM和Linux JVM上运行此软件时,不会出现任何问题.哎呀,我经常在我妻子的入门级笔记本电脑的时间离开周运行相同的软件,而我在我的网站的工作 - 我可以向你保证,如果它是内存泄漏,将那个东西被发现.
如果我刚刚离开一个普通的香草系统运行空闲,没有配置应用程序(基本上就是邮件系统和Web服务器),堆只是继续缓慢增长,导致随着时间的推移被分配更多的内存,每个GC周期不相当于收集到以前的水平.对于没有问题的JVM,模式完全相同,除了那些GC扫描总是将堆减少到之前的GC级别.

但是,如果我在稳定后启动JVM系统转储并在分配的堆显着增长后进行后续转储,则差异比较表明运行一周后不再有可达对象,而不是启动时.最近的一个,一周后显示6个额外的类加载和一些明确相关的对象.对所有活体物体的彻底评论都没有显示出任何让我意想不到的东西.
我已经尝试了优化的吞吐量和世代并发的垃圾收集器.
因此,根据作业的堆大小,我们似乎正在泄漏,并且根据堆转储,没有任何泄漏.
没有调用JNI方法(除了作为核心JVM的一部分运行的本机代码),它肯定是正在增长的堆 - 我可以清楚地看到IBM WRKJVMJOB信息以及在我的控制台中使用JMX bean报告日志文件.
到目前为止,我无法使用JVisualVM之类的JMX工具连接到活动JVM,因为尽管在正确配置时创建了侦听套接字,但是连接被拒绝,显然是在协议级别(TCP/IP堆栈显示已接受的连接,但是JVM反弹它).
我很困惑,不知道下一步该往哪里去.
编辑:只是为了澄清; 这些结果都是使用未经检测的JVM,因为我无法获得对此JVM的JMX访问权限(我们正在与IBM合作).
编辑2011-11-16 19:27:我能够在1823个GC循环中提取GC活动报告,其中包括Soft/Weak/PhantomReference计数的特定计数; 这些数字并没有出现失控增长的迹象.然而,小物体终身空间有显着增长(大物体终身空间是空的).它从9M增长到36M.
在我的程序中消除了一些粗心的内存浪费(虽然没有任何泄漏),并且更好地调整了GC以适应我们的工作负载,我已经将失控的内存使用降低到可容忍的水平.
但是,在此过程中,我已经证明AS/400上使用的IBM J9 JVM(又名iSeries,Systemi,i5等)的泄漏总量为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); }
}
}
Run Code Online (Sandbox Code Playgroud)
除了通过JMX API监视内存使用之外什么也没做的单独的测试程序最终显示1336 B以1分钟的间隔泄漏,永远不会被回收(好吧,在运行2周后没有回收).OP注意:JVM的每个变体实际上略有不同.
更新2012-04-02:几周前,IBM将其作为一个错误接受; 它实际上是在去年年中的Java 5中找到并修补的,Java 6的补丁预计将在下一周或两周内发布.
| 归档时间: |
|
| 查看次数: |
3175 次 |
| 最近记录: |