不出意外这既是 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'
一些可能有用的信息↓
怎么切换默认的 VM? 不知道 hhh
查了一下可以通过 java -client -version 来切换, 但实机测试过并无效果...
2. 关于各种 mode
JVM 可以用 - Xint -Xcomp -Xmixed 指定相应的模式(解释 interpreted, 编译 compiled, 混合)
简单的总结是
解释器模式就是执行字节码
编译器模式是全部转换本地代码
混合模式是在热点方法使用本地代码, 而不常使用的就仅执行解释(HotSpot 由来)
前两者显然是编译期就能完成的事情(javac), 而后者是运行期的事情就归 JIT 来管了, 这部分比较硬核有待恶补
来源: http://www.bubuko.com/infodetail-3085656.html