初识JVM

2021-04-13  本文已影响0人  一码平川

一.什么是\color{blue}{JVM}

\color{blue}{JVM}\color{blue}{Java Virtual Machine}\color{blue}{Java虚拟机})的缩写,\color{blue}{JVM}是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。\color{blue}{JVM}是运行在操作系统之上的,它与硬件没有直接 的交互。

二.\color{blue}{JVM}内存结构

jvm内存结构

1.方法区(Method Area)又名 永久代(Permanent Generatio)

所有线程共享,它用于存储已被虚拟机加载的\color{blue}{类信息、常量、静态变量、即时编译器编译后的代码等数据}
java8把永久代移除,使用元数据区,这个区域不再\color{blue}{JVM}内存中,改由本地内存。

2.堆(Heap)

所有线程共享,它用于存放所有的\color{blue}{实例对象}

3.java栈(java Stacks)

线程独享,它用来描述java方法执行的内存模型:每个方法被执行时,会创造一个\color{blue}{栈帧}\color{blue}{Stack Frame}),用来存放\color{blue}{局部变量表、操作栈、动态链接、方法出口等信息}。每一个方法被调用直至执行完成的过程,就对应着一个\color{blue}{栈帧}在虚拟机栈中从入栈到出栈的过程。

4.本地方法栈(Native Method Stacks)

线程独享,它的作用和java栈类似。不同的是,它是用来描述\color{blue}{Native Method}。即非java方法,一般为操作系统本地方法。

5.程序计数器(Program Counter Register)

线程独享,是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

三.内存分配和回收

1.内存分配:

a.\color{blue}{类信息、常量、静态变量}存储在\color{blue}{方法区}\color{blue}{永久代}

\color{blue}{HotSpot VM}会把这一部分作为\color{blue}{MinorGC}的对象,即不使用 \color{blue}{HotSpot VM}虚拟机时,这部分没有回收机制。使用\color{blue}{HotSpot VM}虚拟机时,在进行\color{blue}{MinorGC}( 标记整理算法 |Mark-Compact算法)时,也会把无用的类和静态变量释放。
\color{blue}{java8}把永久代移除,使用\color{blue}{元数据区},把\color{blue}{永久代}的信息存储在本地内存中,此时,这部分的空间受总内存大小影响,不再有回收机制。

b.实例对象存放在堆区域。

堆又分为\color{blue}{新生代}\color{blue}{Eden}8/10、\color{blue}{ServivorFrom}1/10、\color{blue}{ServivorTo}1/10)和老年代。实例对象优先放到\color{blue}{Eden},大对象(指需要连续存储空间的对象)直接放到\color{blue}{老年代}。当\color{blue}{Eden}空间不足时,会进行\color{blue}{MinorGC}(复制算法 |Copying算法),部分对象会释放,部分会进入\color{blue}{老年代},其余的会进入\color{blue}{ServivorTo}\color{blue}{ServivorFrom}是在进行\color{blue}{MinorGC}时使用的空间。当大对象进入\color{blue}{老年代}或者\color{blue}{MinorGC}有对象进入\color{blue}{老年代}\color{blue}{老年代}空间不足时,会进行\color{blue}{MajorGC}( 标记整理算法 |Mark-Compact算法),\color{blue}{老年代}部分对象被释放,空间重新被整理,使空间可以更好的被利用。

上一篇 下一篇

猜你喜欢

热点阅读