JAVA之JVM内存模型

JVM是什么

Java Virtual Machine,Java的虚拟机
Java语言的平台的无关性,Java虚拟机是实现这一特点的关键。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

JVM的构成

主要来看它是如何分类数据内存的:
《JAVA之JVM内存模型》

从上图中可以看出,数据存储主要分:栈、堆、perm区、本地方法栈

:栈的压入与弹出
八大基本类型的值(boolean、char、byte、short、int、long、float、double)
引用类型的地址
对象的引用地址
如:类的成员变量的地址或值

:新生代、老年代
老年代:经过几次新生代的youngGC仍存在的,放入老年代
新生代 = Eden区+ To Survivor区 +From Survivor区

Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。
Survivor Space幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。

理解为:新new的在edon,第一次放入区域1,然后下次把区域1的跟edon的复制到区域2,再下一次把edan跟区域2复制到区域1,这样循环,from跟to是相对的叫法,即每次from跟from的物理位置是不一样的,from就代表源头
注意:
new一个对象,对象中有类的成员变量,包括基本类型,引用类型(或者叫装箱类型),在堆中开辟一块空间给该对象,在对象内部存储对象的成员变量,基本类型的值或引用对象的地址,该地址在堆中开辟一块新空间存放该对象引用类型的成员变量,如图所示。
所以说:
基本类型跟引用类型既可以存在堆中,也可以存在栈中
方法中的局部变量存放在栈中(基本类型值,引用类型地址,真正存储空间在堆)
类中成员变量存放在堆中(基本类型值,引用类型地址,存储空间也在堆)

perm区:永久代
perm区也叫方法区域,存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时(即反射时候用到的),这些数据都来源于perm区(也叫方法区域),同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

本地方法栈:
native修饰的方法,如System.arrayCopy调用了

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

native方法就被存放在本地方法栈中。

小结

通过整理画图更能理解jvm的数据管理关系。

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/Growing_way/article/details/82085652
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞