JVM内存模型大白话及jvm调优

jdk1.8JVM内存模型

jvm其实是由运行时数据区+类装载子系统+执行引擎组成的,我们通常说的jvm内存模型指的是运行时数据区。
JVM内存模型大白话及jvm调优

运行时数据区

堆(线程共享)

堆是java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。堆中存放对象实例,数组。

虚拟机栈

线程私有的,每个方法执行时会创建一个栈帧,用来存储局部变量表、操作数栈、方法出口、动态链接。栈中存放对象的引用,基本数据类型。
动态链接:每一个线程(方法)中有一个栈帧,保存了一个可以指向当前方法所在类的运行时常量池(某个方法对应的jvm指令码的地址)。当需要调用其他方法时,可以从运行时常量池中取出对应的符号,然后将符号引用转换为直接引用,就可以调用方法。

方法区(线程共享)

用于存储已经被虚拟机加载的类信息,常量,静态变量等。jdk1.7以前叫永久代,1.7后改为元空间。

程序计数器

用来记录线程执行过程中字节码的行号指示器。如果当前线程是native方法,则其值为null。程序计数器是一块很小的内存空间,它是线程私有的。这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

本地方法栈

本地方法栈与虚拟机栈相似,虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++。

相互关系

举个栗子,Object obj = new Object(); 其中obj 是对象引用,存放在虚拟机栈中,而对象实例(new Object())则存在堆中,这里栈指向了堆

private static Object obj=new Object(); 由于静态变量是存储在方法区,obj存入方法区,在创建的静态变量是对象类型时,对象实例还是会存入堆中的。所以,这里方法区指向了堆

然后来说一种堆指向方法区,在我们将编译好的类文件运行时,方法区会加载类的类元信息。这里有必要先说一下对象头指针,在每个对象被new出来时,都会有一个头指针指向方法区中加载的类的信息,可以根据头指针找到对应的类的方法,虚拟机通过这个指针确定这个对象是哪个类的实例。

未完。。。。