Tag: memory leaks

JNI释放内存以避免内存泄漏

所以我有这个从我的Java程序通过JNI调用的C ++程序,代码如下: JNIEXPORT jstring JNICALL Java_com_entrust_adminservices_urs_examples_authn_LdapAuthenticator2_takeInfo(JNIEnv *env, jobject obj, jstring domain, jstring id, jstring idca, jstring password) { const char *nt_domain; const char *nt_id; const char *nt_password; HANDLE hToken = 0; bool aut = false; nt_domain = env->GetStringUTFChars(domain, NULL); nt_id = env->GetStringUTFChars(id, NULL); nt_password = env->GetStringUTFChars(password, NULL); aut = LogonUser(nt_id, nt_domain, nt_password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &hToken […]

为什么我的Java堆转储大小比使用的内存小得多?

问题 我们试图在我们的Web应用程序中找到大内存泄漏的罪魁祸首。 我们在查找内存泄漏方面经验非常有限,但我们发现了如何使用jmap创建Java堆转储并在Eclipse MAT中对其进行分析。 但是,在我们的应用程序使用56 / 60GB内存时,堆转储的大小只有16GB,在Eclipse MAT中甚至更少。 上下文 我们的服务器在Ubuntu 14.04上使用Wildfly 8.2.0作为我们的Java应用程序,其进程使用95%的可用内存。 进行转储时,我们的缓冲区/缓存已用空间为56GB。 我们使用以下命令创建转储: sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid} 堆转储文件大小为16,4GB,当使用Eclipse MAT进行分析时,它表示有大约1GB的活动对象和大约14,8GB的无法访问/浅堆。 编辑:这里有一些关于我们看到的问题的更多信息。 我们监视我们的内存使用情况,我们看到它的增长和增长,直到剩下约300mb的可用内存。 然后它保持在那个内存量附近,直到进程崩溃,遗憾的是应用程序日志中没有错误。 这使我们假设它是一个硬OOM错误,因为这只发生在内存接近耗尽时。 我们为JVM使用-Xms25000m -Xmx40000m设置。 题 基本上,我们想知道为什么我们的大部分内存都没有在这个转储中被捕获。 顶部保留的大小类看起来并不太可疑,所以我们想知道是否存在与堆转储有关的问题我们做错了什么。

为什么有些网络服务器会抱怨他们创建的内存泄漏?

标题可能有点强,但让我解释一下我如何理解会发生什么。 我猜这发生在Tomcat上(引用的消息来自Tomcat),但我不确定了。 TL; DR在底部有一个总结,为什么我声称它是Web服务器的错。 我可能错了(但没有错误的可能性,没有理由问): 应用程序使用库 该库使用ThreadLocal ThreadLocal引用库中的对象 每个对象引用其ClassLoader 网络服务器 汇集其工作线程以提高效率 为应用程序提供任意线程 当应用程序停止或重新部署时,没有什么特别的(在线程池中) 如果我理解正确,在重新部署后,旧的“脏”线程继续被重用。 他们的ThreadLocal引用引用其ClassLoader的旧类,它引用整个旧类层次结构。 所以很多东西都停留在PermGen空间中,随着时间的推移会导致OutOfMemoryError 。 到目前为止这是对的吗? 我假设有两件事: 重新部署频率是每小时几次 线程创建开销只是毫秒的一小部分 因此,每次重新部署时完整的线程池更新每小时花费几分之一毫秒,即,时间开销为0.0001 * 12/3600 * 100%即0.000033% 。 但是,不是接受这个微小的开销,而是有无数的问题 。 我的计算错了还是我忽略了什么? 作为警告,我们得到了消息 Web应用程序…使用类型为…的键创建了一个ThreadLocal,并且值为…但在Web应用程序停止时无法将其删除。 应该更好地说明 Web服务器…使用线程池但在停止(或重新部署)应用程序后无法续订。 或者我错了? 即使所有线程不时重新创建,时间开销也可以忽略不计。 但是在将ThreadLocal提供给应用程序之前清除它们就足够了,甚至更快。 概要 有一些真正的问题(最近这个 ),用户无能为力。 图书馆作家有时可以而且有时不可以。 恕我直言,网络服务器可以很容易地解决它。 事情发生了并且有原因。 所以我责怪唯一一个可以对此采取任何行动的政党。 关于Web服务器应该做什么的建议 这个问题的标题比正确的更具挑衅性,但它有其重要意义。 raphw的答案也是如此。 这个相关问题有另一个公开的赏金。 我认为Web服务器可以解决它如下: 确保每个线程在某个时候被重用(或杀死) 在ThreadLocal存储LastCleanupTimestamp (对于新线程,它是创建时间) 当重新使用线程时,检查清理时间戳是否低于某个阈值(例如,现在减去一些delta ,例如1小时) 如果是这样,请清除所有ThreadLocal并设置一个新的LastCleanupTimestamp […]

如何解决GWT中的内存泄漏问题?

由于GWT是用javascript编译的,而代码是用JAVA编写的,因此解决GWT内存泄漏的最佳方法是什么?

Tomcat 6内存泄漏日志条目

下面是我在CentOS机器上的Catalina.out文件中输入的唯一条目。 我正在使用Spring 3和我的应用程序运行Tomcat 6。 有很多这样的,所以我选择了一些不断重复的东西。 这不会一直发生,但每周至少发生一次。 问题是我该如何防止波纹发生? Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc SEVERE: The web application [] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: […]

解决PermGen问题的各种选择

我正在研究Java 6 18 VM上垃圾收集的各种选项,并希望得到一些指示。 我们在JBoss上运行我们的应用程序,偶尔在重新部署期间会出现臭名昭着的PermGen错误。 互联网上有很多相互矛盾和过时的信息,说明解决或缓解这个问题的最佳方法。 从我所看到的 ,以下是正确的: VM选项本身无法解决此问题 ,只能推迟它。 解决此问题的唯一可靠方法是修复Application Server本身(不太可能)或Application Server中运行的代码(我们的代码或第三方库)(更有可能)中的编码错误。 Permgen的填充通常是应用程序类加载器加载到Application Server类加载器加载的对象的引用的结果,从而防止应用程序的类加载器的垃圾收集。 我有两个问题: 以上是正确的吗? VM选项CMSClassUnloadingEnabled和CMSPermGenSweepingEnabled哪里进入此区域? 从我所看到的CMSClassUnloadingEnabled取代或隐式启用CMSPermGenSweepingEnabled 。 他们中的任何一个都有助于解决上述问题吗?

常见的Java内存/引用泄漏模式?

也许最典型的例子是JDBC关闭完成错误的方式,而不是正确处理可能的exception。 我很好奇你能看到的其他例子 – 最好是网络应用程序相关。 那么,Java中是否存在任何常见的泄漏模式?

使用Hibernate时内存使用率很高

我在linux服务器上用java运行代码服务器端应用程序。 我使用hibernate打开数据库会话,使用本机sql查询它,并始终通过try,catch,finally关闭此会话。 我的服务器查询DB使用非常高频率的hibernate。 我已经定义了MaxHeapSize因为它是3000M但它通常在RAM上使用2.7GB,它可以减少但比增加慢。 有时它的内存使用量会增长到3.6GB,比我的MaxHeapSize在启动时定义的要多。 当使用的内存为3.6GB时,我尝试使用-jmap命令转储它并获得一个大小仅为1.3GB的heapdump。 我使用eclipse MAT来分析它,这里是来自MAT的统治者树 我认为hibernate是问题,我有这么多的org.apache.commons.collections.map.AbstractReferenceMap $ ReferenceEntry。 它可能无法通过垃圾收集处理或者可能会变慢。 我该如何解决?

如何在Java VisualVM中查看内存分配堆栈跟踪

本文介绍如何在Java VisualVM中查看内存分配堆栈跟踪: http : //rejeev.blogspot.de/2009/04/analyzing-memory-leak-in-java.html 简而言之,在Java VisualVM选项中定义自定义预设,并选中内存设置选项卡中的“记录分配堆栈跟踪”复选框 。 现在,当我选择自定义预设并启动内存分析时,我仍然无法查看内存分配堆栈跟踪。 没有右键单击项目操作“拍摄快照并显示分配堆栈跟踪” ,如文章中所述,也没有类似的内容。 我正在使用VisualVM 1.7。 如何查看这些分配堆栈跟踪?

如何防止JTextPane.setCaretPosition(int)中的内存泄漏?

我正在使用基于Swing的GUI开发Java应用程序。 该应用程序使用JTextPane输出日志消息,如下所示:1)截断现有文本以使总文本大小保持在限制之下; 2)追加新文本; 3)滚动到最后(实际逻辑略有不同,但这里无关紧要)。 我使用Eclipse和JVM Monitor来确定合理的文本大小限制并发现重大的内存泄漏。 我试图从底层文档中删除UndoableEditListener并禁用自动插入位置更新(通过使用DefaultCaret.NEVER_UPDATE和JTextPane.setCaretPosition(int)显式更改位置),但没有成功。 最后,我决定完全禁用更改插入位置,这样就修复了泄漏。 我有两个问题: 我的代码有问题吗? 如果是,我如何更改它以完成任务? 它是Swing / JVM错误吗? 如果是,我该如何举报? 细节: 这是SSCCE:带有textPane的GUI和两个按钮,用于小型和压力测试。 FIX和FIXXX标志对应于我修复内存泄漏的尝试。 package memleak; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.UndoableEditListener; import javax.swing.text.*; class TestMain { private JTextPane textPane; // try to fix memory leak private static final boolean FIX = false; // disable caret updates completely private […]