当前位置: 首页 > 面试题库 >

如何在Java中分析内存碎片?

邵锐
2023-03-14
问题内容

我们在服务器上遇到了几分钟的延迟。它们可能是由“阻止世界”垃圾收集触发的。但是我们使用并发标记和清除GC(-XX:+
UseConcMarkSweepG),因此,我认为,这些暂停是由旧一代的内存碎片触发的。

如何分析老一代的内存碎片?有什么工具吗?

每小时都会发生延迟。大多数时间约为20秒,但有时-几分钟。


问题答案:

在Java文档中查找用于打开GC日志记录的“ java -X …”选项。这将告诉您是要收集旧的还是新一代的,以及这些收集需要多长时间。

暂停“几分钟”听起来很不正常。您确定不是仅以太小的堆大小运行,还是在物理内存不足的计算机上运行?

  • 如果堆太接近满了,GC将一次又一次地触发,导致您的服务器将大部分CPU时间都花费在GC中。这将显示在GC日志中。

  • 如果在物理内存不足的计算机上使用大堆,则完整的GC可能会导致您的计算机“崩溃”,大部分时间都在疯狂地将虚拟内存页面移入磁盘或从磁盘移出。您可以使用系统监视工具来观察此情况。例如,通过在典型的UNIX / Linux系统上观看“ vmstat 5”的控制台输出。

跟进

与OP的信念相反,打开GC日志记录 不太可能性能产生明显的影响。

Oracle网站上的“
了解并发标记扫描垃圾收集器日志”页面在解释GC日志时应该会有所帮助。

最后,OP不可能得出结论认为这是一个“碎片化”问题,并且(IMO)没有得到他提供的证据片段的支持。这很可能是其他事情。



 类似资料:
  • 问题内容: 我目前正在使用jconsole监视Java应用程序。内存选项卡使你可以选择: 它们之间有什么区别? 问题答案: 堆内存 堆内存是Java VM从中为所有类实例和数组分配内存的运行时数据区。堆的大小可以固定或可变。垃圾收集器是一个自动内存管理系统,可以回收对象的堆内存。 Eden Space:最初为大多数对象分配内存的池。 幸存者空间:包含在Eden空间的垃圾回收中幸存的对象的池。 终身

  • 问题内容: 本文介绍如何在Java VisualVM中查看内存分配堆栈跟踪:http : //rejeev.blogspot.de/2009/04/analyzing-memory-leak-in- java.html 简而言之,请在Java VisualVM选项中定义一个自定义预设,然后选中 “ 内存设置”选项卡中的 “记录分配堆栈跟踪”复选框 。 现在,当我选择该自定义预设并开始内存分析时,我

  • 问题内容: 我知道Valgrind,但它只是检测内存管理问题。我要搜索的是一个概述的工具,程序的哪些部分确实消耗了多少内存。带有树形图的图形表示(就像KCachegrind对Callgrind所做的那样)会很酷。 我在Linux机器上工作,所以Windows工具对我没有太大帮助。 问题答案: 使用massif,这是Valgrind工具的一部分。massif- visualizer 可以帮助您绘制数

  • 问题内容: 有没有一种类似于函数的释放Java内存的方法?还是将对象设置为null并依靠GC是唯一的选择? 问题答案: Java使用托管内存,因此分配内存的唯一方法是使用运算符,而释放内存的唯一方法是依靠垃圾回收器。 该内存管理白皮书(PDF)可能有助于解释发生了什么。 你还可以致电建议垃圾收集器立即运行。但是,Java Runtime做出最终决定,而不是你的代码。 根据Java文档, 调用gc方

  • 主要内容:分配内存空间,回收算法,总结前边介绍的有关动态内存管理的方法,无论是边界标识法还是伙伴系统,但是以将空闲的存储空间链接成一个 链表,即可利用空间表,对存储空间进行分配和回收。 本节介绍另外一种动态内存管理的方法,使用这种方式在整个内存管理过程中,不管哪个时间段,所有未被占用的空间都是地址连续的存储区。 这些地址连续的未被占用的存储区在编译程序中称为堆。 图 1 存储区状态 假设存储区的初始状态如图 1 所示,若采用本节介绍的

  • 本文向大家介绍php对象在内存中的存在形式分析,包括了php对象在内存中的存在形式分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php对象在内存中的存在形式。分享给大家供大家参考。具体分析如下: (1)$p1对应内存地址,假设是0x123,($p1和地址存放在栈区,相当于我们查字典时的索引); (2)通过内存地址的索引,找到堆区。堆区里面存放着”小王“,”80“等数据 (3)$p2