我正在处理一个大型应用程序(300KLOC),它在Sun1.6JVM(1.6_05)中导致内存泄漏。分析Java显示没有泄漏。JVM是否提供任何诊断来检测泄漏原因?我还不能创建一个简单的、独立的Java测试用例。解决这个问题的唯一方法是在JVM上使用C堆分析器吗?该应用程序创建套接字池并执行大量网络I/O。 最佳答案 像profiler4j这样的分析器可以显示托管和非托管内存(实时曲线)。然后您可以查看是否有泄漏以及泄漏发生的时间。但是您没有找到更多信息。在此之后有2种可能的解决方案:您可以使用实时曲线隔离问题并创建更简单的测试,直
HEREISTHEHEADDUMP(UPDATEDON10/29/2013)我在一个网络应用中工作:Tomcat7.0.24Java6Spring3(使用aop-cglib)基于Log4j的SLF4JOracle一致性经过大量工作,我设法删除了所有对类加载器的强引用,现在它是垃圾收集器的候选者。那么,内存泄漏解决了吗?当然不是!因为在几次热部署之后,由于PermGen空间出现了OOME。感谢Yourkit,我能够检查WebappClassLoader是PendingFinalization这意味着它正在终结队列中等待(实际上,不是WebappClassLoader本身就是他的一个ref
我正在开发一个旧的java程序,其中包含一个带有Fortran调用的native库。所以,我有Java通过JNI调用C,然后调用Fortran。在生产中我们有一个内存不足的错误,比如:Nativememoryallocation(malloc)failedtoallocate120000bytesforjfloatinC:\BUILD_AREA\jdk6_37\hotspot\src\share\vm\prims\jni.cpp我怀疑是内存泄漏。我是公司的新人,我想在Linux上工作,但他们让我在Windows上工作:(在生产环境下,我们使用.so文件,因为我们在solaris上,而我
多年来,毫无疑问,我一直在使用final关键字来表示在实例/类的生命周期内不应更改的字段。我突然想到了...所以给出这个例子:publicclassTestFinalGC{privateTestFinalGC(){}privatefinalObjectobj=newObject();publicstaticvoidmain(String[]args){TestFinalGCinstance=newTestFinalGC();//instanceRef->actualinstance->?objref->actualobjSystem.out.println(instance.obj);
我在Tomcat下运行的Java应用程序遇到了一个非常奇怪的问题。我们尝试在1周的冲刺中从新生成的新产品更新生产代码,该应用程序已经运行了几个月没有打嗝,然后这段新代码使我们的Linux服务器在一段时间后开始交换。非常奇怪的是,当查看VisualVM的内存使用情况时,它从未超过最大堆大小,JVM没有抛出OutOfMemory,机器只开始交换,JVM甚至在交换之后继续运行。所以,似乎是从某处泄漏了内存,似乎是从新代码中泄漏的,但奇怪的是它不在JVM内部,关于如何调试它有什么想法吗?谢谢! 最佳答案 交换不是泄漏的决定性指标。它是由低物
我有一个正在运行的javawebapp,我正在使用visualVM进行监控。这是堆的图:使用两组请求进行了测试,一组在大约3:20,另一组在大约4:40(它们在图中表示为仅有的两个峰值)。我的问题是:这是否意味着我有内存泄漏?我担心中间部分,虽然GC运行,但堆一直保持在250MB。非常感谢您的见解。 最佳答案 在3:20的第一个请求导致一些内存被占用,但请注意,在第二个请求之后的GC回收了大部分内存。另外我认为majorGC是在4:40的第二次请求之后才执行的。看起来没有泄漏。我的理论是3:20的请求导致年轻代被填满,由此产生的次要
下面的代码起作用了,但是Hibernate永远不会放弃它对任何对象的控制。调用session.clear()会导致有关获取连接类的异常,并且在检索下一个对象之前调用session.evict(currentObject)也无法释放内存。最终我耗尽了堆空间。检查我的堆转储,StatefulPersistenceContext是指向我的对象的所有引用的垃圾收集器的根。publicclassCriteriaReportSourceimplementsJRDataSource{privateScrollableResultssr;privateObjectcurrentObject;priva
更新:看起来这不是内存泄漏,有人会基于这个例子的扩展创建吗?原问题:假设我创建并启动了一个不会终止的线程,只要它还活着,该线程就会创建一个对象和引用。请参见以下代码。JVM会收集垃圾x吗?这会被视为内存泄漏吗?publicclassMyRunnableimplementsRunnable{publicvoidrun(){Xx=newX();while(true){}}}Threadt=newThread(newMyRunnable());t.start(); 最佳答案 线程永远不会终止,所以垃圾收集器永远不会释放x。但是,如果您从未
我最近做了thistutorial并让代码运行良好。然后,今天,我在Eclipse中重新打开项目并选择RunAs...RunonServer。从Eclipse控制台中运行的日志来看,该应用程序似乎经历了正常的加载过程,但是当我期望该应用程序改为在浏览器中加载时,Eclipse控制台中出现了以下错误消息:Exceptioninthread"http-bio-8080-exec-3"java.lang.OutOfMemoryError:PermGenspace我也确实运行了来自thistutorial的代码之前,并打开了一些blob文件,但我不认为这是导致问题的原因,因为即使我关闭所有内容
我有我正在使用的来自另一个团队的代码,我花了几天时间试图追踪我的应用程序中可疑的内存泄漏。几次redploy后我收到OutOfMemory错误。我使用了多种工具来追踪泄漏,包括YourKitJavaProfiler和IBM的SupportAssisantMemoryAnalyzer。我的应用程序是一个在WebSphere6.1上运行的Spring3.0.5J2EE应用程序,使用spring-mvc注释驱动Controller。我所做的大部分研究都指向一个我觉得非常可疑的类,我们将其称为MyFactory,它看起来像这样:importorg.springframework.context