运行时内存图片引用他人,如有侵权,告知即删。
1.程序计数器:
1.线程私有。
2.在jvm文档中没有定义OOM。
3.用户代码推进器,不作用于native源码。
4.用来分支,循环,跳转,异常处理等代码流程结构。
2.虚拟机栈(方法栈)
1.线程私有。
2.StackOverFlowError&&OutOfMemoryError。
3.一个方法就是一个栈帧,栈帧的出入栈表示方法的执行。
4.栈帧上包含局部变量表,动态链接,操作数栈,方法出口信息。
5.逃逸分析的介入,对象也可能分配到栈帧上,跟随方法的生命周期。
6.只作用于用户代码(程序员写的代码)
7.操作数栈使用来传递变量,计算表达式等
3.本地虚拟机栈(本地方法栈)
1.线程私有。
2.StackOverFlowError&&OutOfMemoryError。
3.只作用于native代码。
4.其他类似
5.Sun hot spot合二为一。
4.堆:
1.线程共享
- OutOfMemoryError。
3.分配对象的位置。
4.垃圾回收的主要区域。
5.物理不连续,逻辑连续即可。
5.方法区:
1.线程共享
- OutOfMemoryError。
3.存放类信息,常量池,静态变量,即时编译的代码。
4.垃圾回收效率最低的地方。
5.物理不连续,逻辑连续即可。
6.常量池(方法区的一部分)
1>.存放字面量和符合引用
2>.动态改变的,比如String.intern.
6.对象的访问方式:
1.句柄
将java堆划分为句柄池和对象数据池,句柄池中句柄由对象数据的指针和对象类型数据的指针组成。
2.直接指针
没有对象数据池,引用就是对象数据的指针,对象类型数据的指针仍然存在,并指向方法区。
3.why?
句柄的方式当垃圾回收不需要进行对象的移动时,只需要修改句柄的指针既好,但是句柄方式也增加了转换的开销,直接指针就没有这样的开销。
如果这个对象类型还需要保留,比如重新new一个对象赋值给已经存在的对象引用,然后如果是直接指针的方式就需要去移动上图中的对象实例数据。而句柄的方式就不需要,只需要改变下指针的指向就ok.
网友评论