本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。
JVM优化
-
参数类别
- 标准参数
- -client/-server()
- x86
- Windows系统,默认使用Client类型JVM
- 其他系统,满足2G内存且有2核心,默认使用Server类型,否则Client类型
- x64
- 只有Server类型,不支持Client类型
- 区别
- Server的初始堆更大一些, 且使用并行GC, 启动慢运行快
- Client初始堆小一些, 使用串行GC, 启动快运行慢
- -D: 可以给程序传入一些参数, java代码里通过System.getProperty(key)或getProperties()获取
- -X参数
- Running mode
- -Xint interpreted mode
- 启动快,执行慢
- 强制JVM执行所有字节码,降低运行速度,降低10倍左右
- -Xcomp complied mode
- 启动慢,执行快
- 启动时编译所有字节码为本地代码,带来最大程度优化,JIT不会根据代码类型自动判断是否编译
- -Xmixed mixed mode
- interpreted和complied混合使用,由JVM决定
- -XX参数
- boolean类型
- -XX:+DisableExplicitGC
- 非boolean类型
- -XX:InitialHeapSize=111m / -Xms
- -XX:MaxHeapSize=222m / -Xmx
- -XX:PrintFlagsFinal / jinfo -flags {param} {pid}
-
内存模型
对于常量池, 1.6放在了方法区里, 1.7和1.8放在了Heep里
- java7
- Young
- eden: 当eden区变满的时候,gc会将存活的对象移到survivor区
- survivor: suvivor区有两个,同时只会有一个工作,另一个在gc回收时复制对象使用
- S0
- S1
- Old: 大对象会直接进入Old Gen, 或在Survivor区经过几次垃圾回收仍然存活的对象也会进入此区域
- Perm: 主要存放Class,Method,Field对象
- java8
- Young
- Eden: 当eden区变满的时候,gc会将存活的对象移到Survivor区
- Survivor: Suvivor区有两个,同时只会有一个工作,另一个在gc回收时复制对象使用
- S0
- S1
- Old 大对象会直接进入Old Gen, 或在Survivor区经过几次垃圾回收仍然存活的对象也会进入此区域
- MetaSpace
- CSS
- CodeCache
-
JDK提供的常用命令
- jstat - Monitors Java Virtual Machine (JVM) statistics.常用于查看堆内部内存使用情况
- 便于实时显示可以加上 1000(毫秒) 0(显示次数, 非正数则无限次) - 每1秒打印一次
- -class pid: 查看类的加载信息
- -compiler pid: 查看类的编译信息
- -gc pid: 查看类的编译信息
- -gcutil pid: 可以查看堆内存占用率和回收时间
- jmap - Prints shared object memory maps or heap memory details for a process, core file, or remote debug server.可以查看比jstat更详细的内存统计
- -heap pid: 查看堆内存的使用情况
- -histo[:live] pid: histogram直方图显示所有对象以及占用空间, :live可以只查看活跃对象
- -dump:[live,] format=b, file=filename pid: Dump jvm当前内存到文件中
- jstack pid - 用于查看线程状态
- jvisualvm - JDK[6],7,8提供的一个图形化整合以上所有命令的工具, 可远程
- 远程配置: 可加上以下OPTS
- -Dcom.sun.management.jmxremote # 开启JMX
- -Dcom.sun.management.jmxremote.port=9999 # 指定通信端口
- -Dcom.sun.management.jmxremote.authenticate=false # 关闭auth
- -Dcom.sun.management.jmxremote.ssl=false # 关闭SSL
- 远程配置: 可加上以下OPTS
- jstat - Monitors Java Virtual Machine (JVM) statistics.常用于查看堆内部内存使用情况
-
对内存dump进行分析
-
1. jhat [options] dumpfile: 提供了一个简单的Web页面便于查询对象情况(使用OQL查询)
- -port port-number: 指定绑定的Web端口
- -exclude exclude-file: 指定文件排除一些数据成员, 格式(java.lang.String.value)
- -debug int: 指定debug级别默认0, 向上调整
-
2. MAT: 一个基于Eclipse的软件, 很强大, Eclipse.....这里还是不作介绍了
-
-
垃圾回收
-
垃圾回收常见算法
-
1.引用计数算法: 在每个对象内部维护一个计数器, 每当被引用+1, 当计数器归0, 回收, 不能解决循环依赖回收
-
2.标记清除算法: 从根节点遍历所有对象, 标记所有被Root(间接)引用的对象, 标记后释放所有未被标记的 , 耗时,内存碎片化
-
3.标记压缩算法: 在二的基础上把标记的对象复制到内存一侧形成连续, 释放临界值以外所有对象, 耗时
-
4.复制算法
-
5.分代算法
-
-