运行期 【笔记】深入理解 Java 虚拟机:晚期优化( 六 )


在上面的代码里执行了 200 万次 fn 函数,创建了 200 万次 User 对象 。jdk8 里默认就开启了逃逸分析,通过 java -cp . -Xmx3G -Xmn2G - -XX:- Test 命令运行代码,这里特意使用 -XX:- 参数来关闭逃逸分析 。通过 jps 查看 java 进程的 PID,接着通过 jmap -histo [pid] 查看 java 堆上的对象分布情况,结果如下:
albon$ jmap -histo 50590num#instances#bytesclass name----------------------------------------------1:43364179744[I2:200000032000000User3:1764205872[C4:21965736[B5:48254960java.lang.Class6:135332472java.lang.String
可以看到堆里有个 User 对象 。
然后,再通过 java -cp . -Xmx3G -Xmn2G - Test 运行代码,结果如下:
albon$ jmap -histo 50603num#instances#bytesclass name----------------------------------------------1:43258962184[I2:3128315005296User3:1764205872[C4:21965736[B5:48254960java.lang.Class6:135332472java.lang.String
在堆里,我们只看到了 31 万个 User 对象 。由此可以验证,开启逃逸分析之后,只有 31 万左右的 User 对象在 Java 堆上分配,其余的对象已经通过标量替换优化了 。