线上jvm调试命令小结

进程信息
jps
jps -l 输出应用程序main.class的完整package名或者应用程序jar文件完整路径名
jps -v 输出传递给JVM的参数

查看正在运行的java程序的扩展参数
jinfo 16439

线程信息
jstack

更多
https://www.cnblogs.com/duanxz/p/5487576.html

查看堆使用情况 ## 常用 ##
jmap -heap pid:
jmap -heap 16439

查看类实例内存使用情况 ## 常用 ##
jcmd pid GC.class_histogram

jcmd 16439 GC.class_histogram
jcmd 16439 GC.class_histogram | more

jmap -histo 16439

jcmd参数含义:

  • Thread.print, 打印线程栈信息
  • GC.class_histogram, 查看系统中类统计信息
  • GC.heap_dump, 导出堆信息,与jmap -dump功能一样
  • GC.run_finalization, 触发finalize()
  • GC.run, 触发gc()
  • VM.uptime, VM启动时间
  • VM.flags, 获取JVM启动参数
  • VM.system_properties, 获取系统Properties
  • VM.command_line, 启动时命令行指定的参数

实时监控jvm
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
vmid - VM的进程号,即当前运行的java进程号。
还有两个关于显示频率的选项:
interval–间隔时间,单位可以是秒或者毫秒,通过指定s或ms确定,默认单位为毫秒。
count-打印次数,如果缺省则打印无数次。

JVM中堆的垃圾收集情况
jstat -gc 16439 5s 10

新生代、老生代及持久代垃圾收集的情况
jstat -gcutil 16439 5s 10
更多
https://www.cnblogs.com/duanxz/archive/2012/11/03/2752166.html

堆转储 ## 常用 ##

手动转储
jcmd 16439 GC.heap_dump /usr/app/mock_dump.hprof

jcmd 16439 GC.heap_dump /usr/app/mock_dump.hprof

自动转储
OutOfMemoryError是不可预料的,我们很难确定应该何时获得堆转储。有几个JVM标志可以起到帮助。

-XX:+HeapDumpOnOutOfMemoryError该标志默认为false,打开该标志,JVM会在抛出OutOfMemoryError时创建堆转储。

-XX:HeapDumpPath=<path>该标志知道了堆转储将被写入的位置,默认为当前工作目录下生产java_pid<pid>.hprof文件。

-XX:+HeapDumpAfterFullGC 这会在运行一次Full GC后生成一个堆转储文件。

-XX:+HeapDumpBeforeFullGC 这会在运行一次Full GC之前生成一个堆转储文件。

例子:
nohup java -Xms2048M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar mock.jar &

堆转储文件分析工具 ## 常用 ##
推荐Java VisualVM、mat
更多
https://www.cnblogs.com/happy-rabbit/p/6232581.html

### 如何在线上环境中修改JVM参数 在实际生产环境中,通常不建议直接通过命令动态调整已运行的 Java 进程的 JVM 参数,因为这可能会导致不可预测的行为甚至服务中断。然而,可以通过以下几种方式间接实现对 JVM 参数的配置: #### 1. **重启应用并重新设置 JVM 参数** 如果允许停机维护,则可以在应用程序停止后,通过编辑启动脚本中的 `JAVA_OPTS` 或其他相关变量来更新 JVM 参数[^5]。例如: ```bash export JAVA_OPTS="-Xms512m -Xmx1024m -XX:ParallelGCThreads=8 -XX:PermSize=128m -XX:MaxPermSize=256m" ./catalina.sh start ``` #### 2. **使用 JMX 动态调整部分参数** 对于某些支持热加载或动态调整的 JVM 参数(如垃圾回收器行为),可以借助 JMX (Java Management Extensions) 来实时监控和调整这些参数。需要注意的是,并非所有的 JVM 参数都可以被动态更改。 使用 JConsole 或 VisualVM 工具连接到目标 JVM 实例即可完成操作[^4]。 #### 3. **利用 MBeans 接口编程接口** 开发者也可以编写自定义代码调用特定 MBean API 完成一些高级功能,比如调整线程池大小或者 GC 配置等。下面是一个简单的例子展示如何访问 HeapMemoryUsage 数据结构: ```java import com.sun.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; public class GCMonitor { public static void main(String[] args){ for(GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()){ System.out.println(gc.getName()+": "+gc.getCollectionCount()); } } } ``` #### 注意事项 - 不同版本 JDK 支持的功能可能有所差异,请确认所使用的具体版本特性。 - 生产环境下任何变更都应经过充分测试后再实施,以免影响业务正常运转。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值