不出意外这既是6月的第一份文章也是最后一份文章,因为到期末要考试了
目前本机使用JDK11和1.8,默认是1.8,因此输入java -version
会是这样
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)
相信大家都对1前两行秒懂,但个人对最后一行的Server VM
和mixed mode
字眼表示不太理解,因此找了一下相关的JVM资料
1.关于Server和Client
两者有不同的JIT编译器应用于相同的运行时环境
Client VM是专门为快速启动和小内存(small footprints)而优化的,像GUI就很适合
而Server VM是专门为高性能应用而优化的,如服务器应用
其他的话有编译的方法(compile policy),堆的默认值(heap defaults),内联方法(inline policy)
比方说,Client VM的编译器没有采用复杂的优化技术,因此才能快速启动,反之,Server VM采用大量复杂的优化,导致开始时响应很慢,但性能牛逼
同时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来管了,这部分比较硬核有待恶补
原文:https://www.cnblogs.com/caturra/p/10989290.html