虚拟机的基本结构

基本组成:

jvm的由堆,java栈,本地栈,pc程序计数器,方法区(java8叫元数据区),直接内存,类加载子系统,垃圾回收系统,执行引擎,如图

这里写图片描述

作用:

类加载子系统:从文件系统或网络中加Class的信息

方法区:存储从类加载子系统加载Class的信息,还会存放运行时常量的信息,包括字符串和数据常量

java堆:在虚拟机创建时建立,它是java程序主要的内存工作区域,几乎所有对象都存放到这里,堆空间是所有Java线程共享的

直接内存:java的NIO库允许java程序直接使用内存。直接内存位于堆外,直接向系统申请的内存区域,适合读写频繁的场合,不适合内存分配频繁的场合,大小默认为堆的大小 (设置参数-XX:MaxDirectMemeorySize)

垃圾回收系统:是jvm重要组成部分,垃圾回收器可以对堆,方法区,直接内存进行回收,垃圾回收是自动的

java栈:每一个java线程都有一个私有的java栈,在线程被创建是创建,java栈中保存着局部变量表(保存方法的参数和局部变量),操作数栈(存放计算结过程的中间结果和计算过程的变量的临时空间),帧数据区(常量池解析,正常方法返回,异常处理等)

本地方法栈:用于本地方法的调用,jvm允许调用本地方法(通常由c编写)

pc程序计数器:是每一个线程的私有空间,jvm为每一个线程分配一个pc,当执
行的方法不是本地方法,pc指向一个当前正在被执行的指令,如果是本地方法则
为undefined
根据垃圾回收机制不同,java堆可能又不同的结构,最为常见的是java堆分为新生代和老年代,新生代存放新生的对象,或年龄不大的对象,老年代存放老年对象,新生代又分为eden,s0,s1(s0,s1又称为from和to区域,大小相等的)
大多数新生对象都会被分配到eden区,等gc后eden区存活的对象会被放到s0或s1,随后的gc中s1,s0中存活的对象会相互复制,从s0->s1或从s1->0,反复15(默认)就会放到老年区

让我们看看堆空间的一般结构:
这里写图片描述


版权声明:本文为w3045872817原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。