zoukankan      html  css  js  c++  java
  • jvm原理

    1.JVM运行时数据区

    (1)程序计数器:线程私有,可以看做是当前线程所执行的字节码的行号指示器。选取下一条字节码指令、分支、线程恢复等都需要程序计数器来完成。

    (2)虚拟机栈:同样是线程私有,它描述的是java方法执行的内存模型:每个方法在执行的同时,都会创建一个栈帧,用来存放局部变量表、操作数栈、方法出口等信息。java方法从调用到执行,对应着一个栈帧在虚拟机栈中的入栈与出栈。

     (3)本地方法栈:与虚拟机栈的作用类似,不同的是虚拟机栈为java方法的执行服务,而本地方法栈为本地方法服务。

    (4)堆:线程共享,是java虚拟机中所管理内存最大的一部分,它用来存放对象实例以及数组。

    (5)方法区:与java堆一样是线程共享的,用于存储已经被虚拟机加载的类信息、常量、静态变量。

    2.JVM中对象的创建过程

     3.对象的内存布局

    对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充。

    HotSopt虚拟机对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等。第二部分是类型指针,虚拟机通过指针来确定这个对象是哪个类的实例。

    实例数据是对象存储的真正有效数据。

    对齐填充不是必然存在的,没有特别意义,起着占位符的作用。

    4.GC可达性分析流程(判定对象是否存活)

    什么是GC Roots?

      首先用来判定对象是否存活有两种算法:引用计数算法与可达性分析算法。引用计数算法是指给对象中添加一个引用计数器,每当有一个地方引用它计数器就加1,当引用失效时,计数器就减1。可达性分析算法是通过一系列GC Roots对象作为起始点,从GC Roots开始向下搜索,所经过的路径被称为引用链,若一个对象没有任何引用链与GC Roots点相连接,则表明该对象不可达,即该对象判定为可被回收。

    挂起JVM线程的方式?

      抢先式中断与主动式中断。抢先式中断是指GC开始时将所有线程中断,如果发现线程中断的地方不在安全点上,则让线程恢复继续执行,直到“跑”到安全点为止,将线程挂起。主动式中断是GC需要对线程进行中断时,不去直接将线程中断,而是设置一个标志,各个线程执行时去轮询这个标志位,直到判定标志位真时将线程挂起。轮询标志的地方与安全点是重合的。

    安全点与安全区?

         安全点考虑的是两个方面的问题:一是虚拟机需要知道对象引用所在地址,在一些点上记录了这些信息,这些点被称为安全点。另一方面,将所有JVM线程挂起,不能直接在任意的地方执行此操作,需要保证在安全点上对象引用是不会发生变化的。

      安全区是对安全点出现的问题进行优化的,如果线程处于sleep或blocked状态,则无法响应jvm线程中断的请求,而jvm也不可能等待线程重新分配cpu资源。所以通过安全区来解决这个问题,安全区是指在一段代码之中引用不会发生变化。在这个区域之中从任何位置开始GC都是安全的。

  • 相关阅读:
    libevent学习总结
    C#结构体的使用
    函数常用类
    C#函数的基础应用
    数组的应用:冒泡排序,折半查找及二维数组的应用
    作业
    复习break、continue、while、do-while的运用
    编程常用英语单词
    作业:for循环,迭代法和穷举法
    循环语句
  • 原文地址:https://www.cnblogs.com/menbo/p/10639273.html
Copyright © 2011-2022 走看看