读《深入理解java虚拟机》第二章1

来源:互联网 发布:程序员写代码没思路 编辑:程序博客网 时间:2024/06/08 04:44

运行时数据区域主要分为图中几个区域

程序计数器:线程私有,内存小,作用是指向当前线程执行的字节码的行号。字节码解释器通过改变程序计数器的值来取下一条执行的字节码指令。执行java方法时指向正在执行的虚拟机字节码指令地址;执行native方法时,程序计数器置为空。此区域是java虚拟机规范中唯一一个没有规定OutOfMemoryError的区域。

java虚拟机栈:线程私有,生命周期与线程相同;编译器完成;描述的是java方法执行的内存模式,每个方法在执行的时候都会创建一个栈帧,保存局部变量表、操作栈数、动态链接、方法出口等信息’;每一个方法的调用到结束都对应的一个栈帧在虚拟机栈中的进栈和出栈。其中的局部变量表就是平时说的:“java内存分为堆内存和栈内存”中的“栈内存”,作用是用来存储基本数据类型和对象引用(非对象,只是指向对象地址或指针)。此区域有两种内存异常情况,一个是超过栈的深度,StackOverflowError;另一个是超出虚拟机能扩展的内存空间,无法得到申请,OutOfMemoryError

本地方法栈:与虚拟机栈相似,此处调用的是本地方法,与虚拟机栈的java方法不同。

java堆:java虚拟机中最大的一块,所有线程共享,启动时创建;存放java对象实例;原本规定所有对象都分配在堆中,但随着jit编译器的发展和逃逸技术的发展;栈上分配、标量替换可能会微妙的改变一点。此区域是垃圾收集器管理的主要区域,因此也叫GC堆。堆内存没有剩余空间提供给对象实例,出现OutOfMemoryError。(堆内存之前是固定的,现在能通过-Xms和-Xmx进行控制)

方法区:所有线程共享,存放类信息、常量、静态常量、即使编译器编译后的代码等。内存不需要连续空间,可以不指定大小,比java堆多一项的是可以指定不垃圾回收,因为垃圾回收在此处进行针对常量池的回收和对类型的卸载,实施效果难以满意。方法去出现无法满足内存需要,OutOfMemoryError。

运行常量池:方法区的一部分;class文件存放常量池的描述信息;在累加载后将各种字面量和符号引用存入常量池;具备动态性,如:String.intern();如果常量池中有String字面量则返回引用地址,如果没有,则将返回false,同时在常量池存入该字面量。无法再申请内存时,OutOfMemoryError。

直接内存:非java虚拟机内存,因为频繁使用也可能出现OutOfMemoryError错误。设置-Xms的值得总和大于物理内存的限制,OutOfMemoryError。

0 0
原创粉丝点击