
jmap -heap 1
Cannot connect to core dump or remote debug server. Use jhsdb jmap insteadjhsdb(Java HotSpot Debugger)是在JDK 9中引入的命令行实用程序,它是服务性代理(Serviceability Agent)工具的一部分。服务性代理是一个框架,允许对运行中的Java虚拟机(JVM)或崩溃后的核心转储进行深入分析。
引入jhsdb的目的有几个:
统一的调试工具: 在JDK 9之前,开发者需要使用不同的工具,如jmap、jstack、jinfo等来执行各种调试任务。jhsdb将这些工具统一到一个命令行界面下,使得在不切换多个工具的情况下更容易执行广泛的调试和诊断任务。
增强的事后诊断: jhsdb提供了分析核心转储和实时进程的能力,这对事后诊断至关重要。当JVM崩溃时,开发者需要了解崩溃时JVM的状态,这一点尤其有用。
高级分析能力: 使用jhsdb,开发者可以执行高级分析,如检查堆、分析内存使用情况和获取线程堆栈跟踪。它还允许使用内置的命令行调试器(CLD)来调试Java进程,这是一个类似于gdb的基于文本的界面。
跨平台一致性: jhsdb旨在在不同平台上保持一致的工作,为在各种操作系统上进行诊断提供了标准化的方法。
与HotSpot JVM集成: 由于jhsdb是为HotSpot JVM量身定制的,它可以利用HotSpot的内部特性来提供有关JVM内部的详细信息,这对于性能调优和解决复杂问题非常宝贵。
可访问性: 通过包含在JDK中,jhsdb可以立即供所有Java开发者使用,无需额外下载或安装。
可脚本化: 作为命令行工具,jhsdb可以轻松地编写脚本并集成到自动化的调试和诊断工作流中,这对于持续集成和部署管道非常有益。
总的来说,JDK 9中引入jhsdb的目的是通过提供一个强大而多功能的JVM诊断和调试工具来改善开发者体验,从而增强分析和解决Java应用程序中复杂问题的能力。
jhsdb jmap --heap --pid 1
Heap Configuration:
MinHeapFreeRatio = 40 空闲堆空间的最小百分比
MaxHeapFreeRatio = 70 空闲堆空间的最大百分比
NewSize = 1363144 (1.2999954223632812MB) 新生代默认值
OldSize = 5452592 (5.1999969482421875MB) 老年代默认值
MetaspaceSize = 22020096 (21.0MB) 元空间的默认值
MaxHeapSize = 4078960640 (3890.0MB) 堆空间最大值
MaxNewSize = 2447376384 (2334.0MB) 新生代最大值
NewRatio = 2 新生代:老年代 = 1:2
SurvivorRatio = 8 S0:S1:Eden = 1:1:8
MaxMetaspaceSize = 17592186044415 MB 元空间的最大值
CompressedClassSpaceSize = 1073741824 (1024.0MB) 压缩类空间的大小
G1HeapRegionSize = 2097152 (2.0MB) G1垃圾收集器的区域大小
Heap Usage:
G1 Heap:
regions = 1945 Eden区由1945个区域组成
capacity = 4078960640 (3890.0MB) 总容量
used = 53015472 (50.55949401855469MB) 已使用
free = 4025945168 (3839.4405059814453MB) 空闲的
1.2997299233561617% used 使用率
G1 Young Generation:
Eden Space:
regions = 19
capacity = 159383552 (152.0MB)
used = 39845888 (38.0MB)
free = 119537664 (114.0MB)
25.0% used
Survivor Space:
regions = 0
capacity = 2097152 (2.0MB)
used = 180144 (0.1717987060546875MB)
free = 1917008 (1.8282012939453125MB)
8.589935302734375% used
G1 Old Generation:
regions = 7
capacity = 94371840 (90.0MB)
used = 12989440 (12.3876953125MB)
free = 81382400 (77.6123046875MB)
13.764105902777779% used
•传统 jmap:在 JDK 9 及以后版本中,传统的 jmap 工具已被标记为废弃•jhsdb jmap:是新的推荐工具,随 JDK 9+ 提供
•jhsdb (Java HotSpot Debugger) 是一个统一的调试器架构•它整合了多个独立的调试工具,提供一致的使用体验•jmap 只是 jhsdb 的一个子命令
# JDK 8 及以前
jmap -heap <pid>
jmap -histo <pid>
jmap -dump:live,format=b,file=heap.bin <pid># JDK 9 及以后
jhsdb jmap --heap --pid <pid>
jhsdb jmap --histo --pid <pid>
jhsdb jmap --binaryheap --dump --pid <pid>jhsdb jmap 等价命令jhsdb 还提供其他有用的调试命令:
# 启动交互式调试会话
jhsdb clhsdb --pid <pid>
# 使用 jstack 功能
jhsdb jstack --locks --pid <pid>
# 使用 jinfo 功能
jhsdb jinfo --flags --pid <pid>使用 jhsdb jmap 而不是传统 jmap 的主要原因:
•符合 JDK 9+ 的发展方向•工具架构更现代化和统一•传统 jmap 在未来版本中可能被完全移除•提供更好的错误处理和诊断信息
如果你在较新的 JDK 版本中看到这个提示,强烈建议切换到 jhsdb jmap 来确保工具的长期可用性。