下图是完整的虚拟机模型

在这里插入图片描述

我们主要是了解三个

1. 堆区(heap ):

存储的全部是对象,每个对象都包含一个与之对应的class的信息。

jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

2. 栈区(stack):

基本类型变量区、执行环境上下文、操作指令区

每一个线程包含一个stack区,只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在共享堆中;

每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3. 方法区(meathod area):

又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

运行时常量池都分配在 Java 虚拟机的方法区之中
另外两个知道就行了:
本地方法栈(Native Method Stack)
当JVM在执行Native方法时,会在此区域中创建一个栈帧来存放方法的各种信息,比如返回值,局部变量表和各种对象引用等,方法开始执行前就先创建栈帧入栈,执行完后就出栈。

程序计数器(Program Counter Register)
占用很小的一片区域,我们知道JVM执行代码是一行一行执行字节码,所以需要一个计数器来记录当前执行的行数。
在这里插入图片描述
上图引用的是 '‘斯文流氓骚刚’'的博客图片

1.1堆详情图解

堆里面分为年轻代老年代

年轻代默认占1/3(Eden默认8/10 , from默认1/10 , to默认 1/10)
老年代默认占2/3

在这里插入图片描述

minor gc :对年轻代的垃圾回收称作初级回收 , 轻GC

Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法

(满了以后自动执行GC , 了解GC看我以前博客:
https://blog.csdn.net/qq_42795915/article/details/84202836)

new 的对象先进入Eden 以后经过minor gc计算后放入 from , from 再进行minor gc放入to , 再放入from , 直到对象年龄达到15,若还是有引用对象,再放入老年代

老年代满了以后会进行一次Full GC的操作 , 如果gc以后还是满的 , 甚至溢出 , 就会产生堆内存溢出错误


举个堆栈方法区的栗子

过程:

  1. java MainMemory,系统收到指令,启动一个java虚拟机进程

  2. 进程首先从classpath中找到MainMemory.class文件,读取该文件的二进制数据,就是将类信息存放到运行时数据去的方法区中,整个过程是类加载过程,将其加载到方法区中

  3. Java虚拟机定位到方法区中MainMemory类的main()方法的字节码,执行了方法,会分配一个栈帧。

  4. 创建一个实例对象,也就是在堆区分配一个对象的内存,给对象属性赋值

  5. 创建一个Data类对象,先加载该类,然后再分配对象内存,再给该对象赋值

  6. 调用store()方法,分配栈帧

  7. 调用release()方法,分配栈帧

图解:
在这里插入图片描述
以上例子来自 '哈K '的博客