2.JMV的内存模型

91 阅读5分钟

JVM的组成部分

图片来源:blog.csdn.net/u012102104 20180920110415723.png

JVM 的组成部分大致是:类加载子系统、执行引擎、运行时数据区

今天我们要讨论的JVM的内存结构就是上图中的运行时数据区。

JVM的内存模型

image.png

堆内存是线程共享的,堆数据区是用来存放对象和数组(特殊的对象)。堆内存随着JVM启动而创建。众所周知,Java中有一个很好的特性就是自动垃圾回收。垃圾回收就操作这个数据区来回收对象进而释放内存。如果堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。

  • 存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。
  • jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。
  • 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
  • 缺点是,由于要在运行时动态分配内存,存取速度较慢。

方法区

方法区是线程共享的。方法区在JVM中也是一个非常重要的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

栈[线程栈]

  • 存放局部变量
  • 每个方法独占一个栈帧,并且遵循 先进后出 ,就是压栈。
  • 每个线程拥有一个独立的栈【线程私有】。(每个栈里面有多个方法,每个方法独占一个栈帧[栈帧存放着当前方法的所需变量。])如果不停的进行压栈操作【递归操作】会导致栈内存溢出。

参考文章:juejin.cn/post/703596…

局部变量表

局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了方法所需要分配的最大局部变量表的容量。

操作数栈

程序在运行过程中,数据存放的临时空间。

动态链接

运行期间将符号解析成

方法出口

一个方法内(主方法)调用另一个方法时候,要记录主方法的执行位置。当方法执行结束后,要重新放回到主方法的位置。

本地方法栈

代码中的native方法。调用的非java代码,C语言或者C++代码。

程序计数器

1)每个线程独有,记录当前线程正在执行或将要执行的程序行号。

程序计数器是线程私有,所以当一个新的线程创建时,程序计数器也会创建。由于Java是支持多线程,Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined。注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

为什么要有程序计数器?

程序的进行是多线程的,当cpu的使用切换到另一个线程。在切回来的时候,字节码执行引擎要根据程序计数器记录的行号继续执行代码。

疑问?

Metaspace(元空间)和 PermGen(永久代)在方法区中到底是哪个?

参考文章:blog.csdn.net/xiaojin21ce…

方法区是jvm内存模型中的一个,方法区是一个jvm强制要求的一个规范。不同的厂商开发自己的虚拟机要遵循这个规范。规定了所有线程共享的、用于存储类的信息、常量池、方法数据、方法代码等

永久代:是jdk1.8以前的东西了,我们就不要再学这个东西了好么?直接忘记这个东西吧。

元空间:jdk1.8就使用了元空间,不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

JDK8 的方法区是 元空间,其参数设置是 -XX:MetaspaceSize=N -XX:MaxMetaspaceSize=N

-XX:MetaspaceSize ,初始空间大小:达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

-XX:MaxMetaspaceSize,最大空间:默认是没有限制的。

除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:

-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集;

-XX:MaxMetaspaceFreeRatio ,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集;