美文网首页
运行时内存

运行时内存

作者: 你值得拥有更好的12138 | 来源:发表于2019-01-04 22:19 被阅读0次

    图片引用他人,如有侵权,告知即删。

    运行时内存

    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.线程共享

    1. OutOfMemoryError。
      3.分配对象的位置。
      4.垃圾回收的主要区域。
      5.物理不连续,逻辑连续即可。

    5.方法区:

    1.线程共享

    1. OutOfMemoryError。
      3.存放类信息,常量池,静态变量,即时编译的代码。
      4.垃圾回收效率最低的地方。
      5.物理不连续,逻辑连续即可。
      6.常量池(方法区的一部分)
      1>.存放字面量和符合引用
      2>.动态改变的,比如String.intern.

    6.对象的访问方式:

    1.句柄
    将java堆划分为句柄池和对象数据池,句柄池中句柄由对象数据的指针和对象类型数据的指针组成。
    2.直接指针
    没有对象数据池,引用就是对象数据的指针,对象类型数据的指针仍然存在,并指向方法区。
    3.why?
    句柄的方式当垃圾回收不需要进行对象的移动时,只需要修改句柄的指针既好,但是句柄方式也增加了转换的开销,直接指针就没有这样的开销。

    image image

    如果这个对象类型还需要保留,比如重新new一个对象赋值给已经存在的对象引用,然后如果是直接指针的方式就需要去移动上图中的对象实例数据。而句柄的方式就不需要,只需要改变下指针的指向就ok.

    相关文章

      网友评论

          本文标题:运行时内存

          本文链接:https://www.haomeiwen.com/subject/rollrqtx.html