Java虚拟机(一)--初体验
先上图
一 程序计数器(PC寄存器)
作用:当前线程通过这个计数器的值来选取下一条需要执行的指令
特点:1 每个线程都有一个独立的程序计数器
2 如果执行的是一个java方法,计数器记录的是正在直行的虚拟机字节码地址
如果执行的是一个Native方法,计数器值为空
3 此内存区是唯一一个在java虚拟机规范中没有规定任何OutMemoryError情况的区域
二 Java虚拟机栈
作用:java方法执行的内存模型
特点:1 线程私有,生命周期与线程相同
2 每执行一个方法会创建一个栈帧,栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息
3 会抛出StackOverFlowError和OutMemoryError
三 本地方法栈
与虚拟机栈类似,只不过执行Native方法
四 Java堆
作用:用于存放对象实例
特点:1 所有线程共享
2 Java堆是垃圾收集器管理的主要区域
3 会抛出OutMemoryError
五 方法区
作用:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码
特点:1 各个线程共享
2 垃圾收集器收集目标主要针对常量池回收和对类型的卸载
3 会抛出OutMemoryError
六 运行时常量池
作用:存放字面量,符号引用,翻译出来的直接引用
特点:1 方法区的一部分
2 动态性:运行期间也可能将新的常量放入池中,比如String类的intern()方法
3 会抛出OutMemoryError
七 直接内存
JDK1.4引入NIO类后,为了显著提高性能,避免在Java堆和Native堆中来回复制数据,它并不是虚拟机运行时数据区域的一部分,但是也可能会抛出OutMemoryError
八 对象访问
主流的对象访问方式:使用句柄和直接指针
两种方式各有优势:句柄访问方式的好处在于reference存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要被修改。使用直接指针方式的好处是速度更快,节省了一次指针定位的时间开销
-------------------------------------------------未完待续--------------------------------------------------------