Tag: memory leaks

LinkedList内存泄漏

我正在尝试调试挂起的应用程序。 该程序使用一个使用LinkedList实现的队列,在压力测试期间,我发现程序因堆内存不足而停止响应。 我分析了堆转储,发现内存似乎从LinkedList 。 堆转储的相关部分: ▶java.net.Vectior @ 0xff5eacd0 ▶▶java.util.Vector @ 0xff629f30 ▶▶▶java.lang.Object[1280] @ 0xff629f50 ▶▶▶▶class com.itnade.vsm.staticobject.TrapQueue @ 0xff6b23e8 ▶▶▶▶▶java.util.LinkedList @ 0xff6b2460 ▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb954560 ▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb959968 ▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb95ede8 ▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb964230 ▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb969638 … … 正如您在转储中看到的那样, LinkedList$Node不会被删除,并且会累积。 该计划的一般流程是: Queue.offer()→Queue.poll→Queue.remove(object) 为什么LinkedList似乎是泄漏内存,我该如何防止这种情况发生?

如何使用MAT理解类加载器泄漏以及如何避免它们

好吧,这将是一个很长的问题(我想问很多相关的问题,我觉得卡住了!)。 我花了很多时间试图弄清楚某些事情,但我无法自信地得出结论。 我是性能分析/堆分析的新手,我要求初学者帮助深入研究这些领域。 我发现很难理解这些概念,并按照方法弄清楚事情…… 我们面临的问题是,经过几个小时的执行,我们的应用程序响应时间增加,执行变得如此缓慢,使应用程序停止运行! 我还分析了线程转储,我不敢说没有从中收集到太多信息。 我可以看到一些处于timed_waiting状态的线程,但没有一个被阻塞或者没有看到任何死锁检测。 因此,我们已将搜索转向堆转储分析。 答:我正在使用MAT进行堆转储分析。 我读过一些博客。 根据这些,我试图形成我的结论。 我想validation一下我的理解。 问题:从上图中我们可以看到1和2中有多个相同类型的类加载器。 为什么会这样? 事实上,sun.reflect.DelegatingClassLoader有超过1000个条目。 我无法理解这是什么。 现在,让我们深入研究WebappClassLoader的第一个 B. Q1。 这些是这个类加载器定义/加载的类的列表吗? 正如我们在3中看到的那样,有一个父元素。 这是否意味着这个类加载器总是首先咨询这个父类加载器,并检查它是否由它加载。 如果它的祖先的层次结构不可能加载该类,那么只有它自己加载它? Is this understanding of the hierarchy of class loading correct? 我仍然没有得到Defined类和实例列数的含义? 什么实例? 我的意思是,加载类并不是实例化其对象,不是加载器的工作吗? 那个实例数是多少? 在这种情况下,我们可以看到:WebappClassloader有4361个定义的类和65973个实例。 类似地,URLClassLoader(它的父级)有766个定义的类和37399个实例。 它到底意味着什么? 它是否表明任何Classloader泄漏? 现在,当我深入查看WebappClassloader的第二个实例时,我看到它们具有相同的父级(0x80a887a8),并且由它加载/定义的类列表也几乎相同。 为什么会这样? C.现在,当我在WebappClassloader的第一个实例上执行“GC根路径”时,我们可以看到这一点。 我的理解:很multithreading(从我们的应用程序中产生)引用了加载器。 这是一个糟糕的线程实现问题吗? 我需要找到问题的根本原因,然后我只想进一步解决它。 来自堆转储的其余部分的一些其他观察 ThreadGroupContext和WebappClassloader消耗了大部分堆。 当我深入研究ThreadGroupContext的支配树时,我看到了WeakIdentityMap。 那些是什么? 这个dominatior树实际上向我们展示了什么? 当我们深入了解统治者树中的条目时,我们得到了哪些信息? 具有传出引用的向下钻取视图: 带有传入引用的向下钻取视图:我不明白这一点。 […]

使用java substring方法的内存泄漏问题

我查看了java substring方法的所有内存泄漏解决方案。 由于此问题,我仍然会出现内存不足错误。 我有一个字符串的arraylist,长度为1000-3500。 我索引它们并存储它们。 问题是每个字符串都需要通过循环来运行,以存储相同字符串的所有可能不同长度。 为此,我使用循环和子串方法。 而这种方法会导致内存泄漏问题。 我所做的sudo代码: for(int i=0;i<str.length;i++) { //create substring and index it str.substring(0,(str.length()-i)); } str:string。 并且上面的循环运行直到arraylist中的所有字符串都被索引。 我试图修复泄漏, 1。 for(int i=0;i<str.length;i++) { //create substring and index it new String(str.substring(0,(str.length()-i))); } 2。 for(int i=0;i<str.length;i++) { //create substring and index it new String(str.substring(0,(str.length()-i)).intern()); } 3。 for(int i=0;i<str.length;i++) { //create substring and index it […]

WeakReference和内存泄漏

我正在使用VisualVM分析我的应用程序,我发现堆大小在大约3天内增加了大约7MB。 当我使用内存采样器时,我也看到java.lang.ref.WeakReference在实例编号的前五位。 WeakReference的数量正在增加,GC几乎没有影响。 任何想法?

Java子串内存泄漏

基于关于获取String Java String.split内存泄漏的子串的讨论? ,我一直在分析两个示例子字符串的用法示例。 据说,如果调用者在对象中存储字段的子字符串,则对象不会被垃圾收集。 当我运行代码时我获得了OutofMemoryexception,并在通过VisualVM监视它时看到char []分配大小的增加 public class TestGC { private String largeString = new String(new byte[100000]); String getString() { return this.largeString.substring(0,2); //return new String(this.largeString.substring(0,2)); } public static void main(String[] args) { java.util.ArrayList list = new java.util.ArrayList(); for (int i = 0; i < 100000; i++) { TestGC gc = new TestGC(); list.add(gc.getString()); } […]

如何防止Eclipselink使用缓存消耗所有内存?

我的应用程序提取了大量的几何数据。 我使用Eclipselink 2.4.1将数据保存在MySQL数据库中。 应用程序以批处理方式工作,即我收集一组数据,然后保留它,继续下一组,持续等等。 另一个应用程序稍后会读取该数据并对其进行处理,但这个问题仅涉及收集数据的第一个应用程序。 数据收集应用程序运行了一段时间。 我使用一组固定的EntityManagers ,它们在启动时创建并直播,直到应用程序完成。 提取是multithreading的,每个线程有一个EntityManager。 我的问题是无论我如何配置缓存,一段时间后EclipseLink会占用所有内存,过了一会儿我得到一个OutOfMemoryError 。 我使用VisualVM提取我使用Eclipse Memory Analyzer分析的堆转储。 EntityManagerImpl.extendedPersistenceContext.cloneMapping持有可疑数量的内存。 此映射包含对我的几何数据对象的引用。 随着时间的推移,这个映射的大小会达到数百兆字节,这就是造成内存不足错误的原因。 我已经尝试过以下方法: 我通过配置eclipselink.persistence-context.reference-mode=weak使用弱引用。 我已经validation了EntityManagerImpl.extendedPersistenceContext.cloneMapping的类型是IdentityWeakHashMap 。 从关于弱缓存的文档中我可以预期,使用weak模式可以解决问题。 不幸的是,垃圾收集器仍然没有声明条目,我不断出现内存错误。 我试图用eclipselink.cache.shared.default=false完全关闭缓存。 问题依然存在。 有没有人建议这里发生了什么以及如何解决这个问题? 我也愿意接受如何规避问题的建议。

不关闭我的JDBC PreparedStatements会导致内存泄漏吗?

我正在使用java.sql PreparedStatements,我想知道以下内容: 在Java中是Pass-by-Value,Dammit! ,以下是Java的Pass-By约定的示例: public void foo(Dog d) { d = new Dog(“Fifi”); // creating the “Fifi” dog } Dog aDog = new Dog(“Max”); // creating the “Max” dog // at this point, aDog points to the “Max” dog foo(aDog); // aDog still points to the “Max” dog 在我的代码中,这出现如下(半Java伪代码): public void method() { PreparedStatement pstmt […]

堆转储中不可能的Java内存引用

我在下午7:41进行了Java堆转储,我正在使用Eclipse内存分析工具进行分析。 堆转储包括20个会话对象。 在我的堆中的其中一个会话对象上使用Path to GC Roots命令显示以下3个对会话对象的引用。 Finalizer线程拥有的“未完成”链表的终结器引用。 我的目标是排在第3位,最终确定。 来自消息处理程序线程的对会话对象的强引用,该消息处理程序线程本身是从计划在晚上7:11运行的清理TimerTask引用的。 WeakHashMap $ Entry对会话对象的弱引用。 WeakHashMap通过静态强引用保持活动状态。 当会话对象仍然具有强引用和弱引用时,它如何才能在终结器队列中? 在剩余的19个会话对象中,还有1个在终结器队列中,并且具有类似的弱引用。 所有其他18个会话对象仅被弱引用。 为什么GC没有清除这些弱的参考? 几点概括: 对象只有在他们的弱引用被清除后才有资格完成(http://download.oracle.com/javase/6/docs/api/java/lang/ref/package-summary.html) 会话对象没有可以复活它的终结器,即使它已经完成,但是当对象仍处于其他对象后面的未终结队列中时,它无法运行。 我的应用程序不使用幻影引用,它是唯一一个对象有资格完成后应该能够存在的引用。 即使我的应用程序确实使用幻像引用,这些对象也不会公开它们对所持对象的引用。

使用TensorFlow for Java进行内存泄漏

以下测试代码泄漏内存: private static final float[] X = new float[]{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0}; public void testTensorFlowMemory() { // create a graph and session try (Graph g = new Graph(); Session s = new Session(g)) { // create a placeholder x and a const for the dimension to do a cumulative sum along Output x = g.opBuilder(“Placeholder”, “x”).setAttr(“dtype”, DataType.FLOAT).build().output(0); Output […]

如何正确隐藏JFrame

我有一个非常简单的JFrame窗口,其中包含一个按钮: 在main函数中我设置setVisible(true); 我的JFrame和No按钮监听器我要关闭窗口,所以我将可见性设置为false: setVisible(false); 然后我做System.exit(0); 为了防止多次运行程序时可能发生的内存泄漏。 我有两个问题: 我真的需要System.exit(0); 在上述情况下? 如果我将此JFrame作为popup窗口,我实际上无法使用System.exit(0); 因为这将终止整个程序。 那么如何正确关闭弹出窗口并保持在主JFrame窗口中呢? (现在我只用setVisible(false);关闭它setVisible(false);当我通过程序执行多次这样做时,程序变得很慢)。