[JVM_8]JVM调优实战之IDEA速度调优

1,307 阅读2分钟

深入理解JVM一书中为Eclipse调优,总觉得Eclipse开发起来,少点味道,我们来照猫画虎的调优下IDEA吧,这里就不用工作环境调了,使用MacOS上的IDEA来试一下

查看和编辑idea的JVM参数

在idea菜单,help--edit custom VM options中可以编辑所有的vm参数

打开jvisualvm,看到所有生效的vm参数 image.png

聊一下语言的解释和编译特性 编译型语言:c++/c,编译成本地二进制代码,计算机可以直接执行 解释型语言:python,直接解释成计算机可执行的命令,供计算机执行 那么java是编译与解释共存的语言:Java为了实现跨平台的特性,首先使用javac编译器,将java代码编译成class字节码文件,虚拟机通过解释的方式去执行字节码命令,比起C/C++的本地二进制代码来说,速度慢不少,为了解决解释速度的问题

如果一段Java代码被调用到一定次数,就会被判定为热点代码交给JIT即使编译为本地代码,提高运行速度,这也是HotSpot虚拟机名字的由来

JIT编译器 (Just in Time Compiler)编译热点代码

C1编译器(client使用的)轻量级编译器

C2编译期(server使用的)需要较长的编译时间,获得运行期间的速度提升

优化方案

1.类加载时间 通过jstat -class pid查看,可以去掉字节码验证部分提高速度

  • -Xverify:none禁用掉字节码验证(慎用)

2.编译时间 使用server模式-C2编译期,延长编译时间,缩短运行时时间

3.gc时间 GC是其中最重要的一个环节,因为那俩实际上都没法调,而GC频繁,提高GC的运行速度或者缩短停顿时间可以有效提高idea的速度

  • 提高新生代大小,使YGC不要那么频繁,-Xmn
  • 固定老年代大小,使其不要频繁的扩容 -Xms=-Xmn固定堆大小
  • 使用jstat -gccause pid查看gc原因,如果老年代未满还是发生了fullGC 那么可能是代码中显式的调用了System.gc(),可以手动把显式的gc禁用掉,即 -XX:+DisableExplicitGC
  • Idea 中默认使用了CMS+ParNew
  • -Xnoclassgc关闭虚拟机对class的垃圾回收功能
  • XX:CMSInitiatingOccupancyFraction=70 CMS垃圾收集器,当老年代达到70%时,触发CMS垃圾回收,这个太低了呢,浪费,太高了呢,引发并发收集错误,强制替换为SerialOld收集老年代,造成巨大的STW停顿.