2026/1/15 23:07:18
网站建设
项目流程
公司网站建设及维护管理办法,建设网站的公司哪个济南兴田德润怎么联系,查网站是不是用shopify做的,擦彩网站开发目录一、前言二、jmap核心用途三、常用选项详细说明核心常用选项专属dump-options#xff08;配合-dump使用#xff09;特殊选项#xff1a;-F四、实操命令与输出结果解读实操1#xff1a;查看Java堆配置与使用情况#xff08;jmap -heap pid#xff09;执行命令…目录一、前言二、jmap核心用途三、常用选项详细说明核心常用选项专属dump-options配合-dump使用特殊选项-F四、实操命令与输出结果解读实操1查看Java堆配置与使用情况jmap -heap pid执行命令输出结果完整解读实操2查看堆中对象统计信息jmap -histo[:live] pid执行命令输出结果说明核心列常用管道命令优化输出Linux/Unix环境实操3生成堆转储文件jmap -dump:dump-options pid执行命令注意事项五、堆转储文件的后续分析六、内存泄漏/溢出OOM排查最佳实践七、注意事项与避坑指南八、总结一、前言在Java应用运维和问题排查过程中内存泄漏Memory Leak、内存溢出OutOfMemoryError, OOM是高频且棘手的问题。这些问题往往表现为应用响应缓慢、频繁Full GC、最终进程崩溃。jmapJava Memory Map是JDK自带的免费命令行工具无需额外安装随JDK一同部署核心用于生成Java堆转储快照Heap Dump和查看Java进程的堆内存详细使用情况是排查Java内存相关问题的核心工具之一。二、jmap核心用途查看Java堆的整体配置与实时使用情况快速定位堆内存区域新生代、老年代的占用异常生成二进制格式的堆转储文件.hprof为后续通过专业工具MAT、VisualVM、jhat进行深度内存分析提供数据支撑查看堆中对象的统计信息数量、内存占用快速定位大对象、高频创建对象查看永久代JDK 7及以前/元空间JDK 8及以后的使用情况以及等待垃圾回收的对象信息。三、常用选项详细说明jmap的核心语法格式jmap [option] pidpid为Java进程ID可通过jps、ps -ef | grep java命令获取核心常用选项-heap打印Java堆的完整概要信息包含3部分核心内容当前JVM使用的GC算法如Parallel GC、G1 GC堆内存的配置参数初始值、最大值、新生代/老年代分区大小等各内存代新生代Eden、Survivor老年代的实时使用情况、占用比例。-histo[:live]打印Java堆中对象的直方图统计信息核心输出每个类的对象实例数目占用内存大小单位字节类的全限定名如com.alibaba.dubbo.common.utils.StringUtils附加:live后缀时会先触发一次Full GC仅统计GC后存活的对象避免统计无用对象减少数据干扰无该后缀则统计堆中所有对象包括即将被回收的对象。-permstat专用于JDK 7及以前版本打印永久代PermGen的统计信息包含类加载器、加载的类信息、内存占用等JDK 8及以后版本中永久代被元空间Metaspace替代该选项失效如需查看元空间信息可使用-heap选项或jstat -gcmetacapacity。-finalizerinfo打印当前等待进入finalize()方法的对象信息即等待垃圾回收器回收的对象列表。这些对象已经失去所有引用仅等待JVM执行finalize()方法后即可被GC回收可用于判断是否有大量对象滞留在最终回收队列。-dump:dump-options以hprof二进制格式将Java堆的完整信息输出到指定文件该文件无法直接打开查看需借助MAT、VisualVM、jhat等工具进行解析和深度分析。专属dump-options配合-dump使用live仅输出堆中的存活对象同样会触发Full GC不指定则输出堆中所有对象formatb强制指定输出格式为二进制hprof格式这是堆转储的标准格式必须指定否则无法被后续分析工具识别filefile-path指定堆转储文件的保存路径和文件名必填项。例如jmap -dump:live,formatb,fileD:\heap_dump_20260109.hprof 24126。特殊选项-F作用与-dump或-histo配合使用当目标Java进程无响应卡死、阻塞时强制执行对应的操作忽略进程的正常响应状态注意事项不支持live子选项即无法与-dump:live配合使用使用该选项时生成的堆转储文件可能存在数据不完整的情况仅作为应急排查手段。四、实操命令与输出结果解读实操1查看Java堆配置与使用情况jmap -heap pid执行命令# 查看进程ID为24126的Java应用堆内存信息jmap -heap24126输出结果完整解读# 连接进程日志信息 Attaching to process ID 24126, please wait... # jmap正在尝试附加到目标Java进程需等待进程响应 Debugger attached successfully. # jmap已成功附加到进程并连接调试器 Server compiler detected. # 该Java进程运行在Server模式下JVM默认对服务器环境优化 JVM version is 25.121-b13 # JVM版本信息此处为JDK 8u121 # GC与内存分配模式 using thread-local object allocation. # 启用线程本地分配缓冲区TLAB优化对象分配效率 Parallel GC with 4 thread(s) # 使用并行垃圾回收器Parallel GC启用4个GC线程 # 第一部分堆内存配置信息Heap Configuration Heap Configuration: MinHeapFreeRatio 0 # 堆最小空闲比例堆内存空闲低于该值时JVM会扩容堆 MaxHeapFreeRatio 100 # 堆最大空闲比例堆内存空闲高于该值时JVM会缩容堆 MaxHeapSize 5368709120 (5120.0MB) # 堆内存最大容量-Xmx配置此处为5GB NewSize 2684354560 (2560.0MB) # 新生代初始容量-Xmn配置此处为2.5GB MaxNewSize 2684354560 (2560.0MB) # 新生代最大容量与NewSize一致说明新生代大小固定 OldSize 2684354560 (2560.0MB) # 老年代初始容量堆总容量-新生代容量此处为2.5GB NewRatio 1 # 新生代与老年代的容量比例老年代/新生代1即1:1 SurvivorRatio 8 # 新生代中Eden区与单个Survivor区的比例Eden/Survivor8即8:1 MetaspaceSize 21807104 (20.796875MB) # 元空间初始容量JDK 8替代永久代 CompressedClassSpaceSize 1073741824 (1024.0MB) # 压缩类空间最大容量存储类元数据 MaxMetaspaceSize 17592186044415 MB # 元空间最大容量默认无上限此处为理论最大值16EB G1HeapRegionSize 0 (0.0MB) # G1 GC的内存区域大小此处为0说明未使用G1 GC # 第二部分堆内存实时使用情况Heap Usage Heap Usage: PS Young Generation # 新生代使用Parallel ScavengePS收集器并行新生代收集器 Eden Space: # 新生代-Eden区对象创建的主要区域 capacity 1009254400 (962.5MB) # Eden区总容量 used 474955488 (452.9528503417969MB) # Eden区已使用内存 free 534298912 (509.5471496582031MB) # Eden区空闲内存 47.06003639914773% used # Eden区内存占用比例 From Space: # 新生代-Survivor From区存活对象存放区当前正在使用的Survivor区 capacity 834142208 (795.5MB) # From区总容量 used 326834600 (311.69376373291016MB) # From区已使用内存 free 507307608 (483.80623626708984MB) # From区空闲内存 39.182119891000646% used # From区内存占用比例 To Space: # 新生代-Survivor To区备用存活对象存放区当前空闲的Survivor区 capacity 793247744 (756.5MB) # To区总容量 used 0 (0.0MB) # To区已使用内存空闲等待下一次GC free 793247744 (756.5MB) # To区空闲内存 0.0% used # To区内存占用比例 PS Old Generation # 老年代使用Parallel OldPS收集器并行老年代收集器 capacity 2684354560 (2560.0MB) # 老年代总容量 used 1371482032 (1307.9471893310547MB) # 老年代已使用内存 free 1312872528 (1252.0528106689453MB) # 老年代空闲内存 51.091687083244324% used # 老年代内存占用比例51%属于正常范围超过80%需关注 53559 interned Strings occupying 6180024 bytes. # 字符串常量池信息53559个驻留字符串占用6180024字节内存实操2查看堆中对象统计信息jmap -histo[:live] pid执行命令# 查看进程24126的堆对象统计包含所有对象不触发Full GCjmap -histo24126# 查看进程24126的存活对象统计触发Full GC仅保留存活对象jmap -histo:live24126输出结果说明核心列列序号列含义说明1序号按内存占用/对象数量排序的序号2实例数该类的对象实例总个数3内存占用字节该类所有实例占用的总内存大小4类全限定名类的完整名称[C代表字符数组String的底层实现[B代表字节数组常用管道命令优化输出Linux/Unix环境# 1. 分页查看对象统计信息避免刷屏jmap -histo24126|less# 2. 筛选指定包名如alibaba的对象按实例数降序排序jmap -histo24126|grepalibaba|sort-k2-g -r|less# 3. 筛选指定包名的对象按内存占用降序排序jmap -histo24126|grepalibaba|sort-k3-g -r|less实操3生成堆转储文件jmap -dump:dump-options pid执行命令# 生成包含所有对象的二进制堆转储文件jmap -dump:formatb,file/opt/heap/dump_all_24126.hprof24126# 生成仅包含存活对象的二进制堆转储文件触发Full GCjmap -dump:live,formatb,file/opt/heap/dump_live_24126.hprof24126# 应急场景进程无响应时强制执行堆转储不支持livejmap -F -dump:formatb,file/opt/heap/dump_force_24126.hprof24126注意事项堆转储过程的耗时与堆内存大小正相关堆越大耗时越长期间JVM会暂停应用STWStop The World生产环境需避开业务高峰期执行生成的.hprof文件大小接近堆的实际使用大小需确保目标存储路径有足够的磁盘空间建议对生成的转储文件进行编号归档如按时间戳、进程ID命名便于后续多版本对比分析。五、堆转储文件的后续分析生成的.hprof文件无法直接阅读需借助专业工具进行深度分析核心工具如下MATEclipse Memory Analyzer Tool业界主流的堆内存分析工具功能强大支持检测内存泄漏、查找大对象、分析对象引用链等适合生产环境复杂问题排查VisualVMJDK自带的可视化工具位于JDK/bin目录下jvisualvm.exe操作简洁支持导入.hprof文件快速查看堆概况、对象统计、引用关系jhatJDK自带的命令行分析工具可启动一个Web服务器通过浏览器查看堆转储文件内容语法jhat /opt/heap/dump_live_24126.hprof访问http://localhost:7000即可查看功能较简单适合快速排查大型堆文件不推荐。六、内存泄漏/溢出OOM排查最佳实践当应用出现内存不足、频繁Full GC、OOM崩溃时建议按照以下步骤排查提前配置JVM自动生成堆转储在应用启动参数中添加以下配置让JVM在发生OOM时自动生成堆转储文件无需手动执行jmap避免错过现场数据# 开启OOM时自动生成堆转储-XX:HeapDumpOnOutOfMemoryError# 指定堆转储文件的保存路径确保目录存在且有写入权限-XX:HeapDumpPath/opt/heap/oom_dump.hprof# 可选OOM时执行额外命令如通知运维-XX:OnOutOfMemoryErrorsh /opt/scripts/oom_notify.sh手动生成堆转储文件若应用未崩溃但内存异常手动执行jmap -dump:live,formatb,filexxx.hprof pid生成转储文件建议多生成2-3份间隔5-10分钟便于对比对象变化趋势分析堆转储文件使用MAT工具打开转储文件通过「Leak Suspects」泄漏可疑点功能快速定位内存泄漏源头重点关注大量存活且无业务意义的对象长生命周期对象如静态集合引用短生命周期对象未关闭的资源如数据库连接、文件流、网络连接验证与修复根据分析结果修改代码如释放无用引用、优化资源关闭、调整集合大小重新部署应用通过jstat、jmap监控内存变化验证修复效果。七、注意事项与避坑指南JDK版本一致性jmap工具的版本需与目标Java进程的JDK版本保持一致或兼容否则可能出现连接失败、输出异常等问题如JDK 8的jmap无法分析JDK 17的Java进程生产环境慎用jmap -heap在使用CMS GCConcurrent Mark Sweep的场景下执行jmap -heap可能导致目标进程卡死进入T状态甚至引发应用崩溃如需获取堆内存使用状况优先使用jstat -gc或jstat -gccapacity这两个工具轻量且无侵入性-histo:live与-dump:live的Full GC风险这两个选项都会触发Full GC若应用处于高负载状态Full GC可能导致应用长时间停顿影响业务可用性生产环境需谨慎使用权限要求执行jmap的用户需与目标Java进程的运行用户一致或拥有管理员/root权限否则会出现「Permission denied」权限不足错误大型堆文件处理对于超过10GB的堆转储文件MAT工具需要配置足够的内存才能正常打开可修改MAT的启动配置MemoryAnalyzer.ini增加-Xmx参数如-Xmx16G。八、总结jmap是Java内存问题排查的核心工具核心能力是查看堆内存使用情况和生成堆转储文件常用命令优先级jmap -dump生成转储jmap -histo[:live]对象统计jmap -heap堆概要谨慎使用排查内存泄漏/OOM的核心流程生成转储文件 → 专业工具分析 → 定位问题源头 → 修复验证生产环境使用jmap需遵循「轻量优先、避开高峰、多份归档」的原则减少对业务的影响。