JVM就该这样学

在这里插入图片描述

以下文章来源于公众号“程序员求职之路

做Java开发的程序员对JVM应该并不陌生,但工作经验1-2年的程序员很少能很好的去学习及理解什么是JVM和JVM的工作原理。JVM是Java的基石。在进阶高级程序员的路上绕不开JVM。小编今天为大家分析JVM和JVM运行时数据区域,带你走进JVM的世界。

在这里插入图片描述
JVM是Java Virtual Machine 的缩写,又名Java虚拟机。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它由三个子系统构成,分别是类加载子系统、JVM 运行时数据区和执行引擎。

在这里插入图片描述

JDK

JDK即Java Development Kit,是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。它包括JRE和JVM

JRE

JRE即Java Runtime Environment。,是指Java运行环境,也就是我们的写好的程序必须在JRE才能够运行。

JVM

JVM是Java虚拟机的缩写,是指负责将字节码解释成为特定的机器码进行运行,值得注意的是在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识。

在这里插入图片描述
JVM运行时数据区是数据的存储和逻辑运算。JVM运行时数据区的组成部分组成部分包括堆、方法区、栈、本地方法栈、程序计算器等部分组成的,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。

在这里插入图片描述

程序计数器

指向当前线程正在执行的字节码指令的地址(行号)

java中最小的执行单位是线程,因为虚拟机的是多线程的,每个线程是抢夺cpu时间片,程序计数器就是存储这些指令去做什么,比如循环,跳转,异常处理等等需要依赖它。每个线程都有属于自己的程序计数器,而且互不影响,独立存储。

虚拟机栈

栈是数据结构,用于存储当前线程运行方法时所需要的数据、指令、返回地址。

与程序计数器一样,Java的虚拟机栈也是线程私有的,虚拟机栈描述的是Java的方法执行的内存模型,方法每个执行在同时的创建都会一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
在这里插入图片描述

本地方法栈

本地方法栈和虚拟机栈相似,区别就是虚拟机为虚拟机栈执行Java服务(字节码服务),而本地方法栈为虚拟机使用到的Native方法服务。本地方法栈中使用的语言,使用方式,数据结构没有强制要求。主要作用是登记native方法,然后在execution engine执行的时候加载本地方法库。

方法区

它用于存储已被虚拟机加载的类信息(class文件)、常量(1.7有变化存储在堆里面)、静态变量(static)、JIT(即时编译器)编译后的代码等数据。

堆(Heap)

堆是 JVM 所管理的最大的一块内存空间,被所有线程共享,主要用于存放各种类的实例对象。堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

Java堆是垃圾收集管理的主要区域,现在收集器基本都采用分代收集方法。最为常见的就是将整个Java堆分为新生代和老年代。无论怎么划分都是为了更好的回收,分配,利用内存。

新生代
新生代划分为三个区,eden区、s0和s1(s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间);

Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小(8:1:1)

绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

老年代
少部分对象存活周期比较长,或者因为一些特殊原因会进入到老年代。

永久代
JVM 里的永久代其实就是方法区,可以认为永久代就是放一些类信息的。

在这里插入图片描述
在这里插入图片描述
思考题:为什么是新生代是8:1:1而不是9:1?

新生代这样划分是为了更好的管理堆内存中的对象,方便GC算法—复制算法来进行垃圾回收。

新生代内存使用达到90%时开始进行,复制存活的对象到S1区,要知道GC结束后在S1区活下来的对象,需要放回给S0区,也就是对调(对调是指,两个S区位置互换,意味着再一次minor gc 时的区域是eden加,上一次存活的对象放入的S区),既然能对调,其实就是两个区域一般大。这也是为什么会再有个10%的S0区域出来。这样比例就是8:1:1了。
在这里插入图片描述

我们所有的程序都运行在Java虚拟机上,只有对Java虚拟机底层原理进行深入的学习,不管是JVM内存区域、堆的分代与垃圾回收算法、JVM性能调优。全面理解JVM的运行机制后,我们才能成为更优秀的Javaer。
在这里插入图片描述

在这里插入图片描述 扫码关注公众号 给你贴心有效的职业规划