Tag: memory leaks

如何解决swing侦听器内存泄漏?

背景 所以我读到,Swing应用程序中的内存泄漏通常源于各种侦听器(鼠标,键,焦点等)的使用。 本质上,因为您将对象注册为侦听器而忘记取消注册该对象,通知程序最终会保留对象的引用,并泄漏一些内存。 我知道我们的应用程序不是取消注册听众,并对潜在的解决方案进行了一些研究: 我发现处理问题的一种方法是使用WeakReference,可以在这里找到关于swing侦听器的方法的完整细节。 然后,我对NetBeans表单编辑器如何生成代码以在监听器添加到表单后清理并发现NetBeans通过包装对象注册侦听器感到好奇,即 argTypeComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { argTypeComboBoxItemStateChanged(evt); } }); 但是生成的代码似乎没有通过调用removeItemListener来清理。 问题 包装对象是否像弱引用? 对我来说,它看起来可能会泄漏少量内存(包装对象的大小)? 在处理监听器时,您是否有其他方法来确保在完成监听时始终收集垃圾?

以自动方式查找泄漏内存的JUnit测试

我们问题的根源是单身人士。 但单身人士很难打破,与此同时我们有很多unit testing使用单身人士而不用小心在tearDown()方法中完全清除它们。 我认为检测这些测试的好方法是寻找内存泄漏。 如果在tearDown()和System.gc()之后使用的内存大于测试开始时使用的内存,则测试泄漏或类加载器加载更多类。 有没有办法自动检测这类问题?

BufferedImage漏洞 – 还有其他选择吗?

我遇到了BufferedImage的奇怪问题,在某些情况下会占用所有免费的系统内存(3GB,1.5GB免费)。 我创建了一个简单的包装器,我这样使用它: public ImageWrapper(final byte[] bytes) throws ImageWrapperException { this(new ByteArrayInputStream(bytes)); } public ImageWrapper(final ByteArrayInputStream bis) throws ImageWrapperException { try { image = ImageIO.read(bis); bis.close(); } catch (IOException e) { throw new ImageWrapperException(e); } } (我已经证实即使使用image = ImageIO.read(file);也会发生这种情况image = ImageIO.read(file); ) 在第一个“无法分配内存”之前,我没有得到任何例外。 出于某种原因,在读取特定类型的图像时,图像的读取将以消耗的所有系统内存结束。 我不是在谈论堆,而是系统内存。 它只发生在某些环境中 – 它不会发生在我的OSX上 ,但它发生在我的Debian服务器上。 你知道为什么会这样吗? BufferedImage有什么替代方案,可能效果更好吗? 有问题的机器是虚拟服务器。 它可以由它的配置引起吗? 谢谢 编辑: 示例图片: […]

是否可以创建堆转储以分析内存泄漏而无需垃圾回收?

我们在生产中运行Java应用程序的虚拟机上存在一些内存泄漏问题,旧的Gen堆使用量每天都在快速增长,所以我想创建堆转储来分析它。 但是,我注意到VisualVM将在堆转储之前执行完整的GC,这将清除旧的Gen,在这种情况下,堆转储将是无用的。 我还尝试使用以下命令: jmap -dump:live,format = b,file = heap.bin 它还将触发完整的GC。 请问是否有一种方法可以在没有完整GC(或没有GC)的情况下创建堆转储? 或者有没有更好的方法来分析内存泄漏? JDK版本:1.7.0_45 谢谢。

Tomcat和JAXB内存泄漏

我已经追了好几天了。 我们在我们的应用程序中使用JAXB,sun实现。 当停止Tomcat(6或7)时,catalina日志文件中记录了严重的内存泄漏,列出了我们应用程序中的所有JAXB类,两个不同的包中有两个类。 我经历过很多google和Stack溢出链接。 我使用过JProfiler,它告诉我Tomcat在不使用它时会持有Enums,但这不应该是问题。 marshaller或unmarshaller的所有实例都是在本地创建的,并且对于激进的GC设置为null。 我确保在销毁servlet时JAXBcontext为null,并且在我的contextDestroyed中运行System.gc(); 已被建议避免错误。 但仍然会记录错误。 我在Tomcat演示文稿中看到这是已知的错误,因为JAXBContext.newInstance()创建了一个JarURLConnection锁,显然这可以通过禁用缓存来避免,但这对我没有任何作用。 http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf 关于如何在Tomcat上运行的JAXB中修复此内存泄漏的任何其他建议。 这是错误日志: SEVERE: The web application [/myApplication] created a ThreadLocal with key of type [com.sun.xml.bind.v2.ClassFactory$1] (value [com.sun.xml.bind.v2.ClassFactory$1@6a724da1]) and a value of type [java.util.WeakHashMap] (value [{class my.package.model.layout.Element=java.lang.ref.WeakReference@7646bb9f, class my.package.model.layout.ScriptBeforeFileID=java.lang.ref.WeakReference@1dc80063, class my.package.model.layout.OutputProperty=java.lang.ref.WeakReference@359172db, class my.package.model.layout.Data=java.lang.ref.WeakReference@600ba356, class my.package.model.layout.InputProperty=java.lang.ref.WeakReference@1c10945d, class my.package.model.layout.ToPort=java.lang.ref.WeakReference@47c7410, class my.package.model.layout.ConfigFile=java.lang.ref.WeakReference@6a7c8bd, class my.package.model.layout.LayoutInstanceID=java.lang.ref.WeakReference@716bf3b4, class my.package.model.layout.ScriptAfterFunction=java.lang.ref.WeakReference@664ce898, class be.securit.trustbuilder.config.model………}]) […]

内存泄漏使用JNI从Java代码中检索String的值

我正在使用GetStringUTFChars使用JNI从java代码中检索字符串的值,并使用ReleaseStringUTFChars释放字符串。 当代码在JRE 1.4上运行时,没有内存泄漏,但如果使用JRE 1.5或更高版本运行相同的代码,则内存会增加。 这是代码的一部分 msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); (*env)->ReleaseStringUTFChars(env, msgid,msg_id); 我无法理解泄漏的原因。有人帮忙吗? 这个是因为如果我评论其余代码但是留下这部分内存泄漏发生。 这是我正在使用的代码的一部分 JNIEXPORT jobjectArray JNICALL Java_msiAPI_msiAPI_msgtoescalate( JNIEnv *env, jobject job, jstring msgid, jlong msgseverity, jstring msgprefixtext, jint flag ) { opcdata opc_msg_id; /* data struct to store a mesg ID */ const char *msg_id; int ret, ret2; jint val; val=67; jstring str=NULL; […]

Java – Full GC(垃圾收集器)在短时间间隔内发生很多事情,导致性能下降

我在prod环境中看到一些exception行为导致我们在运行Tomcat的服务器上出现高线程数。 堆大小10,092,544K在新一代和产权生成之间分配为2,752,512K + 7,340,032K = 10,092,544K。 我很困惑为什么GC在堆上有足够的内存可用时多次运行(新旧两种)(Full GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen:2748534K-> 2748529K(7340032K) )]) 你可以看到0K-> 0K的年轻人和.27G – > .27G的老一代意味着几乎没有任何对象得到gc’d并且有很多可用的内存。 (堆大小为10G)。 由于Full GC在短时间间隔内运行多次,因此导致性能降低,因此应用程序无法处理传入的用户请求,因此无法处理服务器上的高线程,最终我们必须重新启动服务器以摆脱这种情况。 你能解释一下这里发生了什么。 这是gc.log上的输出。 。 。 更多…… 。 。 7月18日14:52:38 fwprodcontent03 gc.log:3172.122:[GC [PSYoungGen:0K-> 0K(2752512K)] 2750855K-> 2750855K(10092544K),0.0515920 secs] [次:用户= 0.32 sys = 0.01,real = 0.06秒] 7月18日14:52:42 fwprodcontent03 gc.log:3172.174:[Full GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen:2750855K-> 2749937K(7340032K)] 2750855K-> 2749937K(10092544K)[PSPermGen:262143K – > […]

内存泄漏,没有对象数量或大小增加

在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。

java垃圾收集在对话框中

*当我尝试在JFrame中创建一个按钮时,我现在遇到一个非常奇怪的java GC问题,当我单击该按钮时,它会显示需要处理并显示一些图像并需要近200M内存的JDialog。 但问题是当我关闭对话框并重新打开它时,有时它会导致java.lang.OutOfMemoryError。 (不是每次都) 试图解决这个问题,我简化了这个问题并做了一些实验, 这让我更加困惑。 我在“实验”中使用的代码如下所示。 当我单击一个框架中的一个按钮时,我为一个整数数组分配160M内存,并显示一个对话框, 但如果我关闭该对话框并重新打开它,则会出现OutOfMemoryError。 我调整代码,结果是: 如果我不创建对话框并显示它,没有内存问题。 如果我添加一个调用System.gc()的windowsCloseListener到对话框,没有内存问题。 如果我在run()方法中调用System.gc(),则会显示内存问题。 public class TestController { int[] tmp; class TDialog extends JDialog { public TDialog() { super(); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // If I uncommment this code, OutOfMemoryError seems to dispear in this situation // But I’m sure it not a acceptable solution /* this.addWindowListener(new WindowAdapter() { […]

ClassLoader泄漏 – 他们值得解决吗?

ClassLoader泄漏通常会导致java.lang.OutOfMemoryError:PermGen 。 在处理应用程序服务器的过程中,您可能会看到这是许多重新部署常见应用程序的结果。 可以在这两个链接上看到对此问题的解释和可能的解决方案。 (其中包括) http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/17/the-unknown-generation-perm/ http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java 现在大部分时间他们很容易绕过。 只需增加-XX:MaxPermSize,当不可避免的情况发生时,完全重启JVM。 尝试解决这个问题的问题是,在大型应用程序中,许多类可能导致类加载器泄漏,因此类仍然保留在permgen中。 由此产生两个问题: 是否合理地说这样的问题更好地增加最大烫发大小并在必要时重新启动或者应该找到更高优先级的解决方案? 有没有更简单的方法来解决类加载器泄漏?