好程序员Java分享JVM从哪方面入手学习,无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏。掌握了JVM机制,就等于学会了深层次解决问题的方法。对于Java开发者而言,只有熟悉底层虚拟机的运行机制,才能通过JVM日志深入到字节码的层次去分析排查问题,发现隐性的系统缺陷,进而提升系统性能。

  一些技术人员开发工具用得很熟练,触及JVM问题时却是模棱两可,甚至连内存模型和内存区域,HotSpot和JVM规范,都混淆不清。工作很长时间,在生产时还在用缺省参数来直接启动,以致系统运行时出现性能、稳定性等问题时束手无措,不知该如何追踪排查。久而久之,这对自己的职业成长是极为不利的.

  学习JVM首先需要了解Java的运行时数据区域,Java的数据区域包括程序记录器,Java

  虚拟机栈,本地方法栈,堆,方法区,运行时常量池和直接内存.在这些内存区域内,最为重要的是方法栈和堆内存。

  其次需要了解到对象的构建过程,对象的内存布局,内存的布局包括三块区域——对象头、实例数据和对其填充。更为重要的是关于对象创建后的访问方式,包含句柄和直接指针的方式。在这里句柄的访问方式最为重要,句柄的最大好处是 reference 中存储的是稳定的句柄地址,在对象移动(GC)是只改变实例数据指针地址,reference 自身不需要修改。直接指针访问的最大好处是速度快,节省了一次指针定位的时间开销。如果是对象频繁 GC 那么句柄方法好,如果是对象频繁访问则直接指针访问好。

  最后需要了解到JVM的垃圾回收机制和内存分配机制,需要了解到引用计数法,可达性分析法,这两种方法是配合使用的,引用计数计算对象的引用次数,而可达性分析法会分析对象的访问情况。在垃圾回收中,需要针对每一代的算法进行了解,涉及到新生代的标记-清除算法,老年代的标记整理算法,以及分代算法。