Java vitual machine,是一种能够运行java字节码(.class文件)的虚拟机。
一、JDK1.8 JVM运行时内存(高薪必问)
程序计数器:线程私有的(每个线程都有一个自己的程序计数器),是一个指针。代码运行,执行命令。注意:每个命令的执行都有行号标记,程序计数器会标识当前命令执行到多少行了。记录代码执行的位置。
Java虚拟机栈:线程私有的(每个线程都有一个自己的Java虚拟机栈)。一个方法运行,就会给这个方法创建一个栈帧,栈帧入栈执行代码,执行完毕之后弹栈,保存对象引用类型、基本数据类型。
本地方法栈:线程私有的(每个线程都有一个自己的本地方法栈),和Java虚拟机栈类似,java虚拟机栈加载的是普通方法,本地方法栈顾名思义,加载的是native修饰的方法。native:在java中用native修饰的,表示该方法不是java原生的。比如C、C++
堆:heap,线程共享的,所有的线程共享一份。用来存放对象,new出来的对象都存储在这个区域。还有就是常量池。
元空间:存储.class文件,类的信息、方法的定义、静态变量等。都存在这里。隶属于本地内存。
JDK1.8的内存中,将原来的方法区交由元空间(元数据区)来实现了。
二、JDK1.8 堆内存结构(高薪常问)
Young 年轻区(代):Eden+S0+S1,S0和S1大小相等,新创建的对象都在年轻代。
Tenured 年老区:经过年轻代多次GC(垃圾回收)存活下来的对象存在年老区。
从jdk1.8开始,永久代(用于存放静态文件,如java类、方法)中的对象放到了元数据区,不存在永久代这一区域了。