我有一个WebSphere Portal应用程序在一个盒子上运行四个实例,在运行大约7天后,本机内存中只有130-150mb的地址空间可用(使用PMAP)。在另外7-10天的某个地方,这个数字远远低于100mb(我们认为很危险,我们开始回收JVM)。如果我们不进行循环,JVM最终会因SIGSEGV信号而崩溃。
我们已经对类计数和JIT代码的大小进行了一些初步调查。课程数增加,但从50k开始慢慢增加......每天约数百。 7天后JITC大小达到约210 MB,之后每天增长约1 MB。在我们之前的经验中,我们并不认为这些是险恶的价值观。
我们需要能够分解本机堆中的内容,无论是线程(所有线程计数看起来是正常的还是我们有固定的线程池),字符串池,常量池,字节码或其他任何东西。
我们现在尝试的一个方法是将反射阈值降低到0(关闭反射创建的类的字节码访问器)。这个应用程序使用了大量的切入点和大量的反射,所以我们希望这有很大的帮助。
欢迎任何建议。
答案 0 :(得分:0)
可能会有点来回,但是你有GC记录并确保它不会随着时间的推移而增加Java堆吗?看着你的烫发空间? SIGSEGV是一个有趣的,但我希望任何Java内存问题都会出现更多JVM-ish崩溃。
答案 1 :(得分:0)
经过长时间的调查,这最终成为了一个WebSphere bug:PK72252: CALLS TO CLASSLOADER.GETRESOURCEASSTREAM ARE SLOW。已修复6.0.2.33。