当线程无法访问所有已用堆时查找 Java 内存泄漏

2024-04-29

我正在研究基于 Java 的大型系统中潜在的内存泄漏(或至少是内存浪费)。 JVM 运行时的最大堆大小为 5 GB,2-3GB 堆使用量是应用程序的预期基准。 (可能会有更高的峰值)

在我正在调查的过载场景中,堆被填满。使用“Eclipse MemoryAnalyzer Tool”分析堆转储显示(毫不奇怪)堆已完全用完。

MAT 显示了 2 个潜在的泄漏候选者,两者都大约保留了 2.5GB:java.lang.Thread 和系统中在系统事务处理期间广泛使用的域对象。然而,所有这些域对象(毫不奇怪)都可以从 Thread 实例访问。毕竟,这些线程正在处理事务。因此,java.lang.Thread 的 2.5 GB 几乎完全是由这些域对象造成的。这里并不奇怪。

列出所有 java.lang.Thread 实例的对象树并对所有线程的保留堆进行求和,得到 2.5 GB 的保留堆。

如果无法从 java.lang.Thread 实例访问它们,我应该在哪里查找填充堆所需的其他 2.5 GB 空间? - 终结器队列中没有任何内容 - 没有大量无法到达的对象等待 GC

我认为提出这个问题的另一种方法是:“如何找到从 java.lang.Thread 实例无法访问的所有对象?也许是 OQL 查询?”另一个问题是:“有哪些类型的对象除了 Finalizer 队列中的对象和挂起 GC 的未引用对象之外,无法从 java.lang.Thread 的实例访问?”


我也遇到了我们网站内存泄漏的问题,
Use yourkit java 分析器 http://www.yourkit.com/java/profiler/index.jsp它提供了大量的信息,并且凭借其能力,您可以在所有内存都被利用的情况下获得更广泛的图像。
你可以找到很棒的教程查找 Java 内存泄漏 http://www.yourkit.com/docs/demo/JavaMemoryLeak/JavaMemoryLeak.htm用上面的工具。

你的问题,

“除了 Finalizer 队列中的对象和挂起 GC 的未引用对象之外,还有哪些类型的对象无法从 java.lang.Thread 实例访问?”

有四种对象,

  1. 强可达性,可以通过活动对象的引用直接到达的对象
  2. 弱/软可达,具有与之关联的弱/软引用的对象
  3. Pending Finalization,等待终结的对象,并且可以通过终结器队列访问其引用
  4. Unreachable 这些是从 GC root 无法访问但尚未收集的对象

除此之外,JVM还使用本机内存,您可以在IBM上找到其信息JVM 使用的堆和本机内存 http://publib.boulder.ibm.com/infocenter/javasdk/v1r4m2/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.142j9%2Fhtml%2Fheapandnativememusejvm.html and 谢谢你的记忆 http://www.ibm.com/developerworks/library/j-nativememory-linux/根据 YourKit 的JVM内存结构 http://www.yourkit.com/docs/kb/sizes.jsp具有非堆内存,其定义为

另外,JVM 还有堆以外的内存,称为非堆内存。它在 JVM 启动时创建,存储每个类的结构,例如运行时常量池、字段和方法数据、方法和构造函数的代码以及内部字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当线程无法访问所有已用堆时查找 Java 内存泄漏 的相关文章

  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 如何使用 Java Apache POI 隐藏 Excel 工作表中以下未使用的行?

    我正在使用数据库中的数据填充模板 Excel 工作表 for Map
  • getCurrentSession 在网络中休眠

    我正在使用 hibernate 和 jsp servlet 编写一个基于 Web 的应用程序 我读过有关sessionFactory getCurrentSession and sessionFactory openSession方法 我知
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 2^31 次方的 Java 指数错误 [重复]

    这个问题在这里已经有答案了 我正在编写一个java程序来输出2的指数幂 顺便说一句 我不能使用Math pow 但是在 2 31 和 2 32 处我得到了其他东西 另外 我不打算接受负整数 My code class PrintPowers
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据

随机推荐