一、JAVA虚拟机基本结构
1. JAVA虚拟机的基本结构图
图1.1JVM内部结构图
类加载子系统:负责从文件系统或网络加载Class信息,加载的类信息存放在方法区中
方法区:JDK1.6/1.7可以理解为permgen space (永久驻留区),里面还包括一些运行时的常量池信息,
字符串字面值. JDK1.8开始已经没有这个概念,1.8称为”元空间”,其大小只受物理内存限制。
堆:虚拟机启动时候建立,存放java实例对象,所有线程共享该区域
直接内存:物理内存,java NIO库允许java直接使用物理内存
栈:每个线程都有一个私有的java栈,存放局部变量、帧、方法参数等信息。
本地方法栈:和栈类似,主要用于java本地方法调用,如调用C++程序方法
PC寄存器:指向正在被执行的指令,每个线程的私有区域
2.堆和栈的内部一般结构
大多数情况下新创建的对象首先分配到End区,进过一次新生代回收后,
如果对象还存活就进入s0或s1区,之后每经过一次回收,
如果对象还存活年龄就加1,达到一定年龄还存活就进入老年代。
参数 -Xmx500m 指定堆最大空间为500M
参数 -Xss10m 指定栈的最大空间为10M
一个栈帧包括 {局部变量表,操作数栈,帧数据区}三个部分。
局部变量表:保存函数的参数以及局部变量,函数调用结束,
随栈帧的销毁局部变量表也销毁。
操作数栈:主要保存计算过程中的结果和变量的临时存储空间
帧数据区:保存访问常量池的指针,异常处理表也是其中的一部分。
栈上分配:线程私有的对象(不被其他线程访问的对象)可以被分配到栈上,
函数调用结束后自行销毁,比如函数中定义的局部对象等。
3.堆和栈、方法区的关系
有如下代码: