相关疑难解决方法(0)

如何找到Java内存泄漏

你如何在Java中找到内存泄漏(例如,使用JHat)?我试图在JHat中加载堆转储以获得基本外观.但是,我不明白我应该如何能够找到根引用(ref)或其所谓的.基本上,我可以说有几百兆字节的哈希表条目([java.util.HashMap $ Entry或类似的东西),但地图遍布整个地方...有没有办法搜索大地图,或者可能找到大型对象树的一般根源?

[编辑]好的,到目前为止我已经阅读了答案,但我们只是说我是一个廉价的混蛋(这意味着我对学习如何使用JHat更感兴趣而不是支付JProfiler).此外,JHat始终可用,因为它是JDK的一部分.除非当然没有办法与JHat合作但是蛮力,但我无法相信可能是这样.

此外,我认为我不能实际修改(添加所有地图大小的记录)并运行它足够长的时间让我注意到泄漏.

java memory memory-leaks jhat

138
推荐指数
5
解决办法
14万
查看次数

JAVA多线程,内存泄漏,垃圾收集器

对于JAVA应用程序,我还是个新手,但是参与了开发一个需要多线程的相当复杂的JAVA(8)应用程序。我自己和另一个开发人员一直遇到一个问题,该应用程序在运行一段时间后仍会耗尽内存。

最初,我们为应用程序提供了64GB的内存,但是几个小时后,它的内存不足,崩溃并重新启动。只是一遍又一遍地做下去。上下文;该应用程序从消息传递系统(ActiveMQ)接收消息,并且必须通过调用各种数据源以获取值来从消息的meta中构建XML文件。从字面上看,可能需要处理数百万条消息,因此我们开发了一个多线程系统,每个线程处理一条消息,并为应用程序提供40个线程。

但是,由于它不断接收消息,因此总体内存消耗随着时间的推移而增加。我觉得垃圾回收器没有被我们正确地利用?

因此,目前我们有一个父线程:

(new Thread(new ReportMessageConsumer(config, ""))).start();

然后在ReportMessageConsumer中,我们有X个线程设置,因此在当前设置中为40个。因此,这将属于这一组。构建完XML并完成线程处理后,我们如何有效地杀死该线程并强制垃圾回收器释放该内存,以便我们随后可以创建一个新的干净线程来接收另一条消息?

java multithreading garbage-collection

3
推荐指数
1
解决办法
1884
查看次数