启动脚本
JVM_OPTS="-server -Xms2g -Xmx2g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$PRG/logs -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006"
远程调试命令
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006
监控内存使用情况
jstat -gcutil pid 2000 5 //每隔2秒执行一次,共执行5次
S0 //Heap上的S0区已使百分比
S1 //Heap上的S1区已使百分比
E //Heap上的Eden区已使百分比
O //Heap上的Old区已使百分比
M //元空间已使用空间的百分比
YGC //从启动到采样时Young GC次数
YGCT //从启动到采样时Young GC所用时间(单位秒)
FGC //从启动到采样时Full GC的次数
FGCT //从启动到采样时Full GC所用时间(单位秒)
GCT //从启动到采样时用于垃圾回收总时间(单位秒)
jmap -heap pid //生成heap使用情况百分比
查看jvm的参数
jps -mvl
jinfo -flags pid
生成dump文件快照,dump文件记录了JVM中堆内存运行的情况
jmap -dump:live,format=b,file=heap.hprof pid
jvm查看大对象
查看内存对应映射存活情况,这里主要查看对应的java进程有没有大对象,有大对象说明一直占用内存没有释放。
jmap -histo:live pid | head -10
定位某个线程问题
jstack pid | grep -C 20 `printf %x tid`
tid = top -Hp pid
动态设置jvm参数(jinfo是jdk自带的命令)
jinfo -flag -PrintGC pid
查看java系统参数(jinfo是jdk自带的命令)
jinfo -sysprops pid
查看进程状态
cat /proc/pid/status
Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
常用工具
jps //查看java进程信息
jinfo //查看设置参数
jmap //打印内存映射,制作堆dump文件
jstat //性能监控工具
jstack //打印线程的栈信息,制作线程dump文件。
jhat //内存分析工具
jconsole //简易的可视化控制台
jvisualvm //功能强大的控制台
堆大小设置
-Xms1g 初始堆空间大小
-Xmx1g 最大堆空间大小
-Xmn1g 年轻代空间大小
-Xss2m 线程的栈空间大小
堆信息输出设置
-XX:+PrintGC 在控制台输出GC日志
-XX:+PrintGCDetails 会自动开启在控制台输出GC日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+HeapDumpOnOutOfMemoryError 打印内存溢出时的堆信息
-XX:HeapDumpPath=./dump/ 生成的堆信息存放位置
-Xloggc:./gc.log 生成gc日志的信息
垃圾收集的主要算法
标记-清除 标记-压缩 复制 分代收集
1.标记-清除算法(mark sweep) //位置不连续 产生碎片 效率偏低(两遍扫描)
2.标记-压缩算法(mark compact) //没有碎片,效率偏低(两遍扫描,指针需要调整)
3.复制算法 (copying) //没有碎片,浪费空间
4.分代收集算法
如何定位垃圾
1引用计数算法(不能解决的问题引用循环问题)
2可达性分析算法
元空间、直接内存相关
-XX:+AlwaysPreTouch 启动时分配物理内存,否则分配虚拟内存,影响启动时间
元空间参数
-XX:MetaspaceSize=1g 初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize=1g 最大值,默认没限制,达到一定值时触发full gc
元空间参数除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
1)-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
2)-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
直接内存
-XX:MaxDirectMemorySize=1g 最大值,默认没限制,达到一定值时触发full gc
堆外内存的使用jvm没办法控制
-XX:NativeMemoryTracking=detail 追踪JVM的内部内存使用情况,打开会带来5%-10%的性能损耗,生产环境不要引入
查看追踪JVM的内部内存使用情况
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
# summary: 分类内存使用情况.
# detail: 详细内存使用情况,除了summary信息之外还包含了虚拟内存使用情况。
# baseline: 创建内存使用快照,方便和后面做对比
# summary.diff: 和上一次baseline的summary对比
# detail.diff: 和上一次baseline的detail对比
# shutdown: 关闭NMT
例如:jcmd pid VM.native_memory detail scale=MB
参考地址:https://www.cnblogs.com/rude3knife/p/13570423.html
程序内存不断增长问题排查参考文档
https://www.cnblogs.com/muzhongjiang/p/15162383.html
https://www.cnblogs.com/duanxz/p/6089485.html
https://www.cnblogs.com/adolfmc/p/13580748.html