
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java虚拟机的学习和应用是每一位java程序员都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,java虚拟机应用分析。
一、JVM架构基础
JVM进程启动时,ClassLoader会将需要的所有类加载到内存,主要分为以下三步:
BootstrapClass:核心类库,由“BootstrapClassLoader”负责加载,例如基础的运行时类库JRE\lib\rt.jar。
ExtensionClass:java.ext.dirs路径下的类,由ExtClassLoader负责加载。在实际开发中,如果需要添加额外的类库,通常放置于此位置。
ApplicationClass:实际应用包含的类,由AppClassLoader负责加载。
二、JVM预热是指什么?
类加载过程完毕后,所有需要的类会进入JVMcache(nativecode),这样就可以被快速的实时访问。当然,还有许多其它与JVM启动无关的类此时并未被加载。
当应用的一个请求到来,会触发逻辑相关类的一次加载,此过程会有一定的耗时,会影响一次调用的实时响应。这主要是因为JVM的懒加载及JIT机制。因此对于低延迟应用,必须采用特定的策略来处理一次的预加载逻辑,以保障一次的请求的快速响应。此过程,我们称之为JVM的预热。
三、TieredCompilation
JVM即时编译机制会将使用频率较高的方法或者代码块儿编译优化放入本地缓存。以提高程序响应速度。基于此,我们可以通过在应用启动之初,强制加载我们预先认知的高频方法。相应设置参数包括如下:
-XX:+TieredCompilation:开启分层编译(1.7Server模式默认开启)
-XX:CompileThreshold:设置触发即时编译阈值
-XX:+PrintCompilation:打印被编译成本地代码的方法名称
通常虚拟机会通过解释器来收集反馈到编译器的方法调用信息。
附:解释器&编译器
解释器:快速启动,执行
编译器:将热点方法及代码块儿编译成本地代码,提高执行效率
即时编译器编译本地代码需要占用程序运行时间,同时,为了编译出高效的本地代码,解释器需要收集相应的性能监控信息(基于采样、计数器热点探测)供编译器使用,从而影响解释器的执行速度。
分层编译:平衡程序启动相应速度及运行效率
C0:解释执行,不进行编译器编译
C1:将字节码编译为本地代码,进行简单可靠的优化,必要时加入性能监控逻辑
C2:将字节码编译为本地代码,基于性能监控,启用一些优化程度更高,编译耗时更长的优化。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。