Tag: memory leaks

Glassfish / Hibernate的PermGen空间问题

我正在Glassfish 3.1上运行GWT + Hibernate应用程序。 几个小时后,我跑出了Permgen空间。 这没有任何webapp重新加载。 我正在运行–XX:MaxPermSize=256m –XmX1024m 。 我接受了这个页面的建议,发现我泄漏了很多类 – 我的所有Hibernate模型和所有GWT RequestFactory代理。 上面引用的指南说“检查链条,找到意外参考,并修复代码”。 说起来容易做起来难。 类加载器始终指向org.glassfish.web.loader.WebappClassLoader的实例。 进一步深入,我发现了许多来自$Proxy135和类似命名对象的引用。 但我不知道怎么回事。

Java:非堆内存分析

我们遇到的问题是我们的非堆内存一直在增长。 所以我们必须每隔3天重新启动我们的jee(java8) – webapp(正如你在这里的截图中看到的那样: 来自非堆和堆内存的截图 ) 我已经试图找出填满非堆的东西了。 但我找不到任何工具来创建非堆转储。 你有什么想法我可以调查一下,找出哪些元素越来越多? Java的版本 java version “1.8.0_102” Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) Tomcat的版本 Apache Tomcat Version 7.0.59

隐形引用在最近的JVM中仍然是一个问题吗?

我正在阅读Java平台性能 (遗憾的是,因为我最初提出这个问题,链接似乎已经从互联网上消失了),而A.3.3节让我很担心。 我一直在假设退出范围的变量不再被视为GC根,但本文似乎与此相矛盾。 最近的JVM,特别是Sun的1.6.0_07版本,仍然有这个限制吗? 如果是这样,那么我有很多代码要分析…… 我问这个问题是因为这篇论文是从1999年开始的 – 有时情况发生了变化,特别是在GC世界。 由于论文不再可用,我想解释一下这个问题。 本文暗示,在方法退出之前,在方法中定义的变量将被视为GC根,而不是直到代码块结束。 因此,必须将变量设置为null,以允许引用的Object被垃圾回收。 这意味着在main()方法中的条件块中定义的局部变量(或包含无限循环的类似方法)将导致一次性内存泄漏,除非在它退出范围之前将变量置为空。 所选答案的代码很好地说明了这个问题。 在文档中引用的JVM版本中,当foo对象在try块结束时超出范围时,不能对其进行垃圾回收。 相反,JVM将保持打开引用直到main()方法结束,即使任何东西都不可能使用该引用。 这似乎是一个想法的起源,即使变量即将退出范围,将变量引用置零将有助于垃圾收集器输出。

长期存在的Java WeakReferences

我目前正在尝试在我的应用程序中诊断缓慢的内存泄漏。 我到目前为止的事实如下。 我从应用程序的4天运行中有一个堆转储。 这个堆转储包含~800个WeakReference对象,这些对象指向对象(所有相同的类型,我将这个问题称为Foo)保留40mb的内存。 Eclipse内存分析工具显示这些WeakReferences引用的每个Foo对象都不会被任何其他对象引用。 我的期望是这应该使这些Foo对象弱到可靠 ,因此它们应该在下一个GC收集。 这些Foo对象中的每一个都有一个时间戳,表明它们是在4天运行过程中分配的。 在此期间我也有日志确认垃圾收集正在发生。 我的应用程序正在创建大量的Foo对象,并且只有很小一部分在堆转储中以这种状态结束。 这告诉我,根本原因是某种竞争条件。 我的应用程序使用JNI调用本机库。 JNI代码在初始化初始化期间调用NewGlobalRef 4次以获取对它使用的Java类的引用。 尽管只是被WeakReferences引用(根据Eclipse Memory Analyzer Tool),但是可能导致这些Foo类无法收集的原因是什么? EDIT1: @mindas我使用的WeakReference等效于以下示例代码。 public class FooWeakRef extends WeakReference { public long longA; public long longB; public String stringA; public FooWeakRef(Foo xiObject, ReferenceQueue xiQueue) { super(xiObject, xiQueue); } } Foo没有终结器,只要WeakRefs尚未被清除,任何终结器都不会被考虑。 当一个对象弱到达时,它不能最终确定。 有关详情,请参阅此页面 。 @kasten在对象可以最终化之前清除弱引用。 我的堆转储表明这没有发生。 @jarnbjo我引用了WeakReference Javadoc: “假设垃圾收集器在某个时间点确定一个对象是弱可达的。那时它将primefaces地清除对该对象的所有弱引用以及对该对象可从其访问的任何其他弱可达对象的所有弱引用通过一系列强大而柔软的参考资料。“ 这告诉我,GC应该检测到我的Foo对象“弱可达”和“当时”清除弱引用这一事实。 […]

如何以编程方式找出我的PermGen空间使用情况?

我正在尝试在Sun的Hotspot JVM上运行时诊断java.lang.OutOfMemoryError: PermGen Space错误,并且想知道我的程序在各个点使用了多少PermGen空间。 有没有办法以编程方式查找此信息?

关闭数据库连接以避免内存泄漏

跟进问题到Java中的关闭数据库连接 Connection conn = DriverManager.getConnection( “jdbc:somejdbcvendor:other data needed by some jdbc vendor”, “myLogin”, “myPassword” ); Statement stmt = conn.createStatement(); try { stmt.executeUpdate( “INSERT INTO MyTable( name ) VALUES ( ‘my name’ ) ” ); } finally { //It’s important to close the statement when you are done with it stmt.close(); } conn.close(); 我知道conn.close()是必要的,但不知道为什么。 一旦方法调用结束,垃圾收集器是否会释放连接对象(并释放存储在其中的每个处理程序指向数据库)?

在javafx中使用css导致实时蜡烛图表的大量内存使用

我跟随了javafx的整体样本 ,并试图创建一个蜡烛棒图表。 它使用这行代码加载一个css文件ensemble2.css getStylesheets().add((CandleStickChart.class.getResource( “ensemble2.css”) .toExternalForm())); 但是当我描述我的应用程序(每100毫秒添加一个蜡烛)时,它使用大约2千兆比特的内存但是当我删除CSS时它只使用了一半的内存。 可能的原因是什么以及如何改进。 谢谢

在org.apache.catalina.core.JreMemoryLeakPreventionListener中急切调用URLConnection的setDefaultUseCaches(false)的原因是什么

这个问题可能有点难以找到答案。 这是一个系列中的问题。 考虑Policy.getPolicy()的原因是什么,因为它将保留对上下文的静态引用并可能导致内存泄漏 。 你可以阅读它,这样你就可以了解更多背景知识。 从org.apache.cxf.common.logging.JDKBugHacks以及org.apache.catalina.core.JreMemoryLeakPreventionListener获取源代码。 有一段代码。 这里是。 URL url = new URL(“jar:file://dummy.jar!/”); URLConnection uConn = new URLConnection(url) { @Override public void connect() throws IOException{ // NOOP } }; uConn.setDefaultUseCaches(false); 评论说 /* * Several components end up opening JarURLConnections without * first disabling caching. This effectively locks the file. * Whilst more noticeable and harder […]

我应该经常调用EntityManager.clear()来避免内存泄漏吗?

我是JPA / OpenJPA的新手,我注意到如果我在持久化实体后没有调用EntityManager.clear() ,我会得到一个OutOfMemoryError (我继续在循环中添加新实体)。 我不确定这是否是预期的行为,或者只是OpenJPA 1.2.1故障。 那么,我是否需要自己明确分离实体? 如果我不是,那么这是一个好习惯吗?

android地图,标记和内存泄漏

我正在阅读android文档http://developer.android.com/reference/com/google/android/gms/maps/MapFragment.html ,我发现了这句话: 从GoogleMap获取的任何对象都与视图相关联。 重要的是不要在视图的生命之外保持对象(例如标记)。 否则会导致内存泄漏,因为视图无法释放。 我不完全理解这一点,我不确定它是否适用于我,但我只是想检查一下:这只适用于主视图仍然存在时片段被破坏的情况,对吧? 我的地图片段是该布局的xml中唯一的元素,因此我假设当用户导航时,标记对象(以及其他所有内容)都会被销毁。 我是对的,还是相反?