JAVA虚拟机的组成
什么是虚拟机?
虚拟机是运行在隔离环境下的完整的计算机系统,JAVA虚拟机对字节码进行解释、生成对应的机器码并进行执行。是JAVA跨平台的缘由。java
JAVA虚拟机的组成部分
- 堆区
- 方法区(永久代)
- 虚拟机栈
- 本地方法栈
- 程序计数器
堆区(堆内存)
堆内存因为是垃圾回收的主要区域,也被称之为GC堆,其主要是用于存放对象实例,这块区域被全部的线程共享,堆内存还细分为如下区域线程
- 新生代(存活区Survivor)
1.1 Eden区,用于存放新建立的对象,当满了的时候会进行 minor GC。当进行了minor GC后,存活下来的对象(还有引用指向的对象)会被放到该from区。
1.2 from区,用于存放通过了minor GC后还存活的对象实例,每通过一次minor GC年龄都会加1。而且每次进行minor GC时,都会经过对象实例的年龄来判断其去向,年龄到达了老年代的标准(默认15岁)会被放到老年代中,未到年龄会被复制到to区(这个时候to区就会变成新的from区),不可达对象会被回收。
1.3 to区,用于存放通过了minor GC后还存活的对象实例,与from的做用一致
提示:from区与to区老是有一个区是空的
- 老年代
存放from区放进来的对象实例,老年代满了后会进行Major GC(清除老年代) 或者Full GC(全量回收,会将新生代的一块儿回收)
- 永久代(方法区)(元空间)
用于存储已被JAVA虚拟机加载的类信息、常量、静态变量、静态方法等...不会进行垃圾回收
方法区
在JDK1.8以前叫作方法区
在JDK1.8以后删除了方法区,更名为了元空间对象
虚拟机栈
用于存放对象的引用、基本数据类型、基本数据类型的值、局部变量。以及从堆内存中加载方法进虚拟机栈进行运行。内存
本地方法栈
使用Native本地方法服务字符串
程序计数器
每一个线程都会有一个独立的程序计数器,能够理解为记录线程执行字节码文件的行数虚拟机
字符串常量池
JDK6及其之前,字符串常量池存放在堆区的永久代中
JDK7以后,字符串常量池存放在普通的堆内存中class