JAVA虚拟机的组成>从零开始学java系列

JAVA虚拟机的组成

什么是虚拟机?

虚拟机是运行在隔离环境下的完整的计算机系统,JAVA虚拟机对字节码进行解释、生成对应的机器码并进行执行。是JAVA跨平台的缘由。java

JAVA虚拟机的组成部分

  • 堆区
  • 方法区(永久代)
  • 虚拟机栈
  • 本地方法栈
  • 程序计数器

堆区(堆内存)

堆内存因为是垃圾回收的主要区域,也被称之为GC堆,其主要是用于存放对象实例,这块区域被全部的线程共享,堆内存还细分为如下区域线程

  1. 新生代(存活区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区老是有一个区是空的
  2. 老年代
    存放from区放进来的对象实例,老年代满了后会进行Major GC(清除老年代) 或者Full GC(全量回收,会将新生代的一块儿回收)
  3. 永久代(方法区)(元空间)
    用于存储已被JAVA虚拟机加载的类信息、常量、静态变量、静态方法等...不会进行垃圾回收

方法区

在JDK1.8以前叫作方法区
在JDK1.8以后删除了方法区,更名为了元空间对象

虚拟机栈

用于存放对象的引用、基本数据类型、基本数据类型的值、局部变量。以及从堆内存中加载方法进虚拟机栈进行运行。内存

本地方法栈

使用Native本地方法服务字符串

程序计数器

每一个线程都会有一个独立的程序计数器,能够理解为记录线程执行字节码文件的行数虚拟机

字符串常量池

JDK6及其之前,字符串常量池存放在堆区的永久代中
JDK7以后,字符串常量池存放在普通的堆内存中class

相关文章
相关标签/搜索