JVM虚拟机的学习笔记一(体系结构概览)

1.JVM体系结构概览

 

 

 

 

Java虚拟机所管理的内存包含以下几个运行时数据区域:

  1.程序计数器:是当前线程所执行的字节码的行号指示器。就是通过改变这个行号指示器的值来选取下一个需要执行的字节码指令,从而可以实现循环、跳转、分支、异常处理等基础功能。Java虚拟机的多线程是通过线程间的轮流切换、粉配处理器执行时间来实现的,所以为了让线程切换后恢复到正确的执行位置,每个线程的计数器是独立的,互不影响,包括主线程。如果线程执行的是Java代码,计数器记录的是字节码的行号,如果执行的是本地方法,计数器为空。Undefined。这个区域不会报内存溢出异常。

  2.Java虚拟机栈:其也是线程私有的,生命周期与线程相同,其描述的是Java执行的线程内存模型。每个方法被执行时会创建一个栈帧(一种数据结构),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。(其中动态链接是:在类加载机制中,解析步骤会把符号引用转为直接引用,还有一部分会在执行过程中才变成直接引用,这就是动态链接)。栈帧的入栈到出栈就是一个方法完整的执行过程。重点是虚拟机栈中的局部变量表,其存放的是基本数据类型、对象引用、returnAddress类型(一条字节码的地址)。当线程请求的栈的深度大于虚拟机允许的深度,会报StackOverflowError。当栈拓展时无法申请到足够的内存会报OutOfMemoryError。

  3.本地方法栈:其与Java虚拟机栈作用相似,只是Java虚拟机栈为Java方法服务,而本地方法栈为本地方法服务。也有上面两种异常。

  4.Java堆:虚拟机管理的内存中最大的一块。Java堆是所有线程共享的,其唯一目的就是存放对象实例。一个对象的创建,其引用放在栈,实例放在堆。Java堆是垃圾收集器管理的内存区域,因此有的人称他为GC堆。GC相关内容后面再记。无论堆这么划分,其存储的都只是对象的实例,细分的目的只是为了更好的回收内存和分配内存。当Java堆无法完成实例分配,堆也无法拓展,会报OutOfMemoryError。

  5.方法区:与Java堆一样,是线程共享的内存区域。用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。如果方法区无法满足内存分配需求,将会报OutOfMemoryError异常。

 

posted @ 2020-09-23 17:27  🍰嗯,有点bug  阅读(99)  评论(0)    收藏  举报