gpt4 book ai didi

java - 识别未被垃圾收集的对象的更好方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:53 25 4
gpt4 key购买 nike

一言以蔽之

我有一个程序随着时间的推移逐渐使用越来越多的内存。我正在使用 jmap 和 jhat 来尝试诊断它,但还不够准确。

背景

该程序是一个长期运行的服务器,由 hbase 数据存储支持,为其他一些东西提供节俭服务。然而,在运行几天后,它最终会达到分配的堆限制,并且几乎所有时间都花在垃圾收集上来回 Swing 。似乎在某处保存了大量数据的引用

到目前为止我做了什么

在摆弄 jstat 和 jconsole 之后,我最终使用运行进程的 jmap 进行堆转储,并通过 jhat 运行它,简单的数字加起来没有接近内存利用率

jmap -F -dump:live,format=b,file=heap.dump 12765

jmap -F -dump:format=b,file=heap.all 12765

直方图顶部的一些东西

Class   Instance Count  Total Size
class [B 7493 228042570
class java.util.HashMap$Entry 2833152 79328256
class [Ljava.util.HashMap$Entry; 541 33647856
class [Ljava.lang.Object; 303698 29106440
class java.lang.Long 2851889 22815112
class org.apache.hadoop.hbase.KeyValue 303593 13358092
class org.apache.hadoop.hbase.client.Result 303592 9714944
class [I 14074 9146580
class java.util.LinkedList$Entry 303841 7292184
class [Lorg.apache.hadoop.hbase.KeyValue; 303592 7286208
class org.apache.hadoop.hbase.io.ImmutableBytesWritable 305097 4881552
class java.util.ArrayList 302633 4842128
class [Lorg.apache.hadoop.hbase.client.Result; 297 2433488
class [C 5391 320190

虽然此处的总数并未加起来,但在获取堆转储时,该进程使用了​​超过 1GB 的内存。

直接明显的罪魁祸首似乎是我到处都是 HBase 结果和键值条目。试图追踪引用资料,我最终点击了

Object at 0x2aab091e46d0

instance of org.apache.hadoop.hbase.ipc.HBaseClient$Call@0x2aab091e46d0 (53 bytes)

Class:

class org.apache.hadoop.hbase.ipc.HBaseClient$Call
Instance data members:

done (Z) : true
error (L) : <null>
id (I) : 57316
param (L) : org.apache.hadoop.hbase.ipc.HBaseRPC$Invocation@0x2aab091e4678 (48 bytes)
this$0 (L) : org.apache.hadoop.hbase.ipc.HBaseClient@0x2aaabfb78f30 (86 bytes)
value (L) : org.apache.hadoop.hbase.io.HbaseObjectWritable@0x2aab092e31c0 (40 bytes)
References to this object:

Other Queries

Reference Chains from Rootset
Exclude weak refs
Include weak refs
Objects reachable from here

需要帮助:

似乎没有对这个最终 HBaseCLient$Call 对象的引用(或任何其他类似的对象,每个对象都包含一千个左右的键值及其所有内部数据)。它不应该被GCed吗?我只是误解了 gc 的工作方式或 jhat 将在多大程度上验证引用?如果是这样,我还能做些什么来追踪我“丢失”的内存?我还可以采取哪些其他步骤来追踪此问题?

最佳答案

查看这篇 Java 内存监控文章 Link

这可能会帮助您解决问题 http://java.sun.com/developer/technicalArticles/J2SE/monitoring/

关于java - 识别未被垃圾收集的对象的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com