JVM 参数类型
标准参数
X参数
- 非标准化参数
- -Xint:解释执行
- -Xcomp:第一使用就编译成本地代码
- -Xmixed:混合模式,JVM自己来决定是否编译成本地代码
XX参数
- Boolean类型
格式:-XX:[+-]
- 非Boolean类型
格式:-XX:
需要注意的是:-Xms和-Xmx虽然是以X打头,但是实际上是XX参数
- -Xms等价于-XX:InitialHeapSize
- -Xmx等价于-XX:MaxHeapSize
查看JVM运行时的参数
- -XX:+PrintFlagsInitial
- -XX:+PrintFlagsFinal
- -XX:+UnlockExpire
=表示默认值,:=表示用户修改过后的值
1 | jinfo -flag MaxHeapSize {pid} |
jstat查看JVM统计信息
类加载 -class
垃圾收集 -gc
JIT编译 -compiler
JVM的内存结构
堆区:
- Young: S0 + S1 + Eden
- Old
非堆区(Metaspace):
- CCS
- CodeCache
jamp + MAT 实战内存溢出
Java里面的内存溢出是说创建的对象一直不释放
堆内存溢出
- 构造一个List不停地添加普通对象
- -Xmx32M, -Xms32M
非堆内存溢出
- 构造一个List不停地添加Class对象
- -XX:MetaspaceSize=32M, -XX:MaxMetaspaceSize=32M
如何导出内存映像文件
- 内存溢出自动导出:
- 使用jmap命令手动导出:jamp -demp:format=b.file=heap.hprof
MAT分析内存溢出
官网下载,将上一步的文件导入。
jstack实战死循环与死锁
监控远程普通Java进程
远程启动 Java 进程时加上如下的参数,然后通过 JvisualM 就可以通过JMX连接进行监控了。
nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port={port}
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname={ip} -jar {jar_name}.jar &
Btrace(可以考虑基于Btrace实现一个监控工具)
Btrace 本质上就是一个拦截器,可以给 Java 进程动态添加拦截,它不需要修改原有的 Java 代码,
通过一个独立进程提供监控。
- 默认只能在本地运行
- 生产环境下可以使用,但是被修改的字节码不会被还原
1 | btrace pid {Btrace脚本} |
- 拦截方法
- 拦截时机
- 拦截this、参数、返回值
- 其他