Tag: 内存泄漏

Hibernate为每个查询生成不同的SQL

我刚刚在探查器下测试了我的应用程序,发现sql字符串占用了大约30%的内存! 这很奇怪。 应用程序内存中存储了很多像这样的字符串。 这是由hibernate生成的SQL查询,请注意不同的数字和尾随下划线: select avatardata0_.Id as Id4305_0_,…… where avatardata0_.Id=? for update select avatardata0_.Id as Id4347_0_,…… where avatardata0_.Id=? for update 这是我无法理解的部分。 为什么hibernate必须为每个查询生成具有不同标识符的不同sql字符串,如“ Id4305_0_ ”? 为什么不能为所有相同的查询使用一个查询字符串? 这是绕过查询缓存的某种技巧吗? 如果有人能形容我为什么会这样,以及如何避免这种资源浪费,我将不胜感激。 UPDATE 好。 我找到了。 假设内存泄漏我错了,这是我的错。 Hibernate按预期工作。 我的应用程序在10个线程中创建了121(!)SessionFactories,它们生成了大约2300个SingleTableEntityPersisters实例。 每个SingleTableEntityPersister生成大约15个具有不同标识符的SQL查询。 Hibernate被迫生成大约345,000个不同的SQL查询。 一切都很好,没有什么奇怪的:)

Java桌面应用程序的内存分析

我的应用程序加载大约的数据集。 每次85bm到100mb。 应用程序的内存限制设置为512mb,从理论上讲,这已经足够了。 但是,我发现,如果在应用程序的单次运行中,我打开并关闭数据集5次,则总内存消耗会稳定增加,直到出现内存不足错误: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6882 bguiz 20 0 679m 206m 19m S 30 13.7 0:30.22 java 6882 bguiz 20 0 679m 259m 19m S 9 17.2 0:55.53 java 6882 bguiz 20 0 679m 301m 19m S 9 20.0 1:20.04 java 6882 bguiz 20 […]

Listview内存泄漏

我有一个简单的列表视图与适配器。 我动态创建了10多个listviewitems。 然后我一次又一次地上下滚动….我可以看到可用的内存不断下降…… 我需要在哪里免费? 注意 – 有一个imageview – 但在我的测试中我没有使用任何图像,所以它是View.GONE。 另外 – 我可以使用哪个工具来分析android上的内存使用情况。 我找到了你的Kit,但是如何为android配置它(我在设备上运行应用程序)/ Activity类 package org.BJ.Food4All.Activities.NewRecipe; import org.BJ.Food4All.R; import org.BJ.Food4All.Recipe; import org.BJ.Food4All.Recipe.Instruction; import org.BJ.Food4All.Activities.RecipeBook.RecipeInstructionsListViewAdapter; import org.BJ.Food4All.Activities.RecipeBook.SharedData; import org.BJ.Food4All.utils.CameraUtil; import org.BJ.Food4All.utils.ImageUploadItem; import android.app.ListActivity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.widget.AdapterView; import […]

Java中是否存在内存泄漏?

我多次问这个问题。 什么是回答的好方法

当我在Thread对象上调用run()时,为什么我的Java程序会泄漏内存?

(危险的问题,我希望当我遇到这个问题时答案已经在线) 使用Java 1.4,我有一个方法,我想在某些时候作为一个线程运行,但不是在其他人。 所以我将它声明为Thread的子类,然后根据我的需要调用start()或run()。 但我发现我的程序会随着时间的推移泄漏内存。 我究竟做错了什么?

使用死Groovy代码定位填充PermGen的代码

我们已经使用java.lang.OutOfMemoryError: PermGen space每两周对我们的glassfish实例进行一段时间的研究。 我将PermGen空间增加到512MB,并使用jstat -gc转储内存使用量。 两周后,我想出了下图,显示了PermGen空间是如何稳定增加的(x轴上的单位是分钟,y轴是KB)。 我试着用谷歌搜索某种可以查明错误的分析工具,并在SO上提到了一个提到jmap的post,这被certificate是非常有用的。 在从jmap -permstats $PID转储的大约14000行中,大约12500行包含groovy/lang/GroovyClassLoader$InnerLoader ,指向我们自己的Groovy代码或Groovy本身的某种内存泄漏。 我必须指出,Groovy构造的相关代码库不到1%。 示例输出如下: class_loader classes bytes parent_loader alive? type 3811 14830264 null live 0x00007f3aa7e19d20 20 164168 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aa7c850d0 20 164168 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aa5d15128 21 181072 0x00007f3a9607f010 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00007f3a7afb4120 0x00007f3aad0b40e8 36 189816 0x00007f3a9d31fbf8 dead org/apache/jasper/servlet/JasperLoader@0x00007f3a7d0caf00 …. 那么我该如何继续了解更多关于导致此问题的代码? 在本文中,我推断我们的Groovy代码是在某处动态创建类。 从jmap的转储我可以看到大多数死对象/类(?)都有相同的parent_loader,虽然我不确定在这种情况下这意味着什么。 我不知道怎么从这里开始。 附录 对于后来者来说,值得指出的是, 接受的答案并不能解决问题 […]

在大型Java堆转储中查找内存泄漏的方法

我必须在Java应用程序中发现内存泄漏。 我对此有一些经验,但希望就此采用方法/策略方面的建议。 欢迎任何参考和建议。 关于我们的情况: 堆转储大于1 GB 我们有5次堆转储。 我们没有任何测试案例来激发这一点。 它只发生在至少一周使用后的(大规模)系统测试环境中。 该系统建立在内部开发的遗留框架之上,存在许多设计缺陷,无法统计它们。 没有人深入了解框架。 它已被转移到印度的一个人,他几乎没有跟上回复电子邮件。 我们已经完成了快照堆转储,并得出结论,没有一个组件随着时间的推移而增加。 一切都在缓慢增长。 以上指出了我们的框架是本土的ORM系统,它可以无限制地增加其使用。 (这个系统将对象映射到文件?!所以不是真正的ORM) 问题: 帮助您成功捕获企业级应用程序泄漏的方法是什么?

是JVM在执行jmap时停止了吗?

当jmap进行内存转储时,我的java应用程序是否继续运行? 谢谢

了解Java内存管理

Java程序员知道JVM运行垃圾收集器,而System.gc()只是建议JVM运行垃圾收集器。 如果我们使用System.gc(),它不一定会立即运行GC。 如果我误解了Java的垃圾收集器,请纠正我。 除了依赖Java的垃圾收集器之外,是否有其他方式进行内存管理? 如果您打算通过某种有助于管理内存的编程实践来回答这个问题,请这样做。

java.lang.OutOfMemoryError:无法创建新的本机线程

我看到这样的评论 我已经看到这个问题的一个地方是如果你继续创建线程,而不是调用start(),直接在线程对象上调用run()。 这将导致线程对象不被解除引用…所以在一段时间后,无法创建新的本机线程的消息出现 在Sun Java论坛上 在我的应用程序中,我们最初计划使用线程,但后来我们决定不再需要了,所以我们只调用run()而不是start()。 我们是否需要为新的threadClass(..)做手动GC? 我的tomcat启动设置 -Xms1024m -Xmx1024m -XX:MaxPermSize=450m