JVM第四讲:性能调优
1、JVM 调优的参数可以在哪儿设置参数值
可以在IDEA,Eclipse,工具里设置
如果上线了是WAR包的话可以在Tomcat设置
如果是Jar包直接 :java -jar 直接插入JVM命令就好了
- 补充图片
2、说一下 JVM 调优的工具?
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具
-
jconsole:用于对 JVM 中的内存、线程和类等进行监控
-
-
jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等
-
Grafane:
- todo 补充数据
3、常用的 JVM 调优的参数都有哪些?
#常用的设置
- -Xms:初始堆大小,JVM 启动的时候,给定堆空间大小。
- -Xmx:最大堆大小,JVM 运行过程中,如果初始堆空间不足的时候,最大可以扩展到多少。
- -Xmn:设置堆中年轻代大小。整个堆大小=年轻代大小+年老代大小+持久代大小。
- -XX:NewSize=n 设置年轻代初始化大小大小
- -XX:MaxNewSize=n 设置年轻代最大值
- -XX:NewRatio=n 设置年轻代和年老代的比值。如: -XX:NewRatio=3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代+年老代和的 1/4
- -XX:SurvivorRatio=n 年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。8表示两个Survivor :eden=2:8 ,即一个Survivor占年轻代的1/10,默认就为8
- -Xss:设置每个线程的堆栈大小。JDK5后每个线程 Java 栈大小为 1M,以前每个线程堆栈大小为 256K。
- -XX:ThreadStackSize=n 线程堆栈大小
- -XX:PermSize=n 设置持久代初始值
- -XX:MaxPermSize=n 设置持久代大小
- -XX:MaxTenuringThreshold=n 设置年轻带垃圾对象最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。
#下面是一些不常用的
- -XX:LargePageSizeInBytes=n 设置堆内存的内存页大小
- -XX:+UseFastAccessorMethods 优化原始类型的getter方法性能
- -XX:+DisableExplicitGC 禁止在运行期显式地调用System.gc(),默认启用
- -XX:+AggressiveOpts 是否启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等,jdk6之后默认启动
- -XX:+UseBiasedLocking 是否启用偏向锁,JDK6默认启用
- -Xnoclassgc 是否禁用垃圾回收
- -XX:+UseThreadPriorities 使用本地线程的优先级,默认启用
4、JVM的GC收集器设置
-xx:+Use xxx GC
xxx 代表垃圾收集器名称
- -XX:+UseSerialGC:设置串行收集器,年轻代收集器
- -XX:+UseParNewGC:设置年轻代为并行收集。可与 CMS 收集同时使用。JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值。
- -XX:+UseParallelGC:设置并行收集器,目标是目标是达到可控制的吞吐量;
- -XX:+UseParallelOldGC:设置并行年老代收集器,JDK6.0 支持对年老代并行收集。
- -XX:+UseConcMarkSweepGC:设置年老代并发收集器;
- -XX:+UseG1GC:设置 G1 收集器,JDK1.9默认垃圾收集器;
5、标准中心虚拟机参数
6、什么是堆内存? 参数如何设置? 美团
堆内存是指由程序代码自由分配的内存,与栈内存作区分。
- 在 Java 中,堆内存主要用于分配对象的存储空间,只要拿到对象引用,所有线程都可以访问堆内存
- -Xmx, 指定最大堆内存。如 -Xmx4g. 这只是限制了 Heap 部分的最大值为 4g。这个内存不包括栈内存,也不包括堆外使用的内存。
- -Xms, 指定堆内存空间的初始大小。如 -Xms4g。而且指定的内存大小,并不是操作系统实际分配的初始值,而是 GC 先规划好,用到才分配。专用服务器上需要保持 – Xms和 – Xmx 一致,否则应用刚启动可能就有好几个 FullGC。当两者配置不一致时,堆内存扩容可能会导致性能抖动
- -Xmn, 设置堆中年轻代大小,等价于 -XX:NewSize,使用 G1 垃圾收集器 不应该设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4
- -XX:MaxPermSize=size, 这是 JDK1.7 之前使用的。 Java8 默认允许的 Meta 空间无限大, 此参数无效。
- -XX:MaxMetaspaceSize=size, Java8 默认不限制 Meta 空间, 一般不允许设置该选项。
- -XX:MaxDirectMemorySize=size, 系统可以使用的最大堆外内存, 这个参数跟 -Dsun.nio.MaxDirectMemorySize 效果相同。
- -Xss, 设置每个线程栈的字节数。 例如 -Xss1m 指定线程栈为 1MB, 与-XX:ThreadStackSize=1m 等价