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本身不需要被修改。使用直接指针方式的好处是速度更快,节省了一次指针定位的时间开销


-------------------------------------------------未完待续--------------------------------------------------------








猜你喜欢

转载自blog.csdn.net/weixin_41574643/article/details/80181569