不出意外这既是6月的第一份文章也是最后一份文章,由于到期末要考试了html
目前本机使用JDK11和1.8,默认是1.8,所以输入java -version
会是这样java
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)服务器
我的对Server VM
和mixed mode
字眼表示不太理解,所以找了一下相关的JVM资料oracle
1.关于Server和Clientide
二者有不一样的JIT编译器应用于相同的运行时环境性能
Client VM是专门为快速启动和小内存(small footprints)而优化的,像GUI就很适合测试
而Server VM是专门为高性能应用而优化的,如服务器应用优化
其余的话有编译的方法(compile policy),堆的默认值(heap defaults),内联方法(inline policy)ui
比方说,Client VM的编译器没有采用复杂的优化技术,所以才能快速启动,反之,Server VM采用大量复杂的优化,致使开始时响应很慢,但性能牛逼code
同时Server JVM的默认堆和最大堆都比Client的大
命令以下java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
一些可能有用的信息↓
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#sthref30
怎么切换默认的VM?不知道hhh
查了一下能够经过java -client -version来切换,但实机测试过并没有效果。。。
2.关于各类mode
JVM能够用-Xint -Xcomp -Xmixed指定相应的模式(解释interpreted、编译compiled、混合)
简单的总结是
解释器模式就是执行字节码
编译器模式是所有转换本地代码
混合模式是在热点方法使用本地代码,而不常使用的就仅执行解释(HotSpot由来)
前二者显然是编译期就能完成的事情(javac),然后者是运行期的事情就归JIT来管了,这部分比较硬核有待恶补