Jvm--01、Jvm内存结构

版权声明:转载 请注明 原始链接 https://blog.csdn.net/sswqzx/article/details/84836317

HotSpot VM,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

话不多说上图、Jvm内存结构图:

深入理解Java虚拟机(第二版)如图: 

 

 方法区和堆是线程共享的、所有会有线程安全的问题。

1、Java堆(java heap)()

1、概述
 java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。
此内存区域的唯一目的就是存放对象实例,这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。 

2、只存放对象本身、引用类型

2、java虚拟机栈(java virtual machine stacks)

1、概述
java虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:
每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
栈中只保存基础数据类型的对象和自定义对象的引用、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问

2、栈中只保存 基础数据类型、局部变量、和自定义对象的引用(不是对象)

3、本地方法栈(Native Method Stack)

1、概述
本地方法栈与虚拟机栈所发挥作用非常相似,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法
(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。本地方法栈也是抛出两个异常

2、本地方法栈:java语言调用外部语言(C语言)方法使用native、安卓开发--应用层java api和底层C语言通信(JNI)

4、方法区

1、概述
方法区与java堆一样,是各个线程共享的内存区域,、即时编译器编译后的代码等数据。
它有个别命叫Non-Heap(非堆)。当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常。

2、存储已被虚拟机 加载的类信息、常量、静态变量、常量池

5、直接内存(DirectMemory)

直接内存不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。
但这部分区域也呗频繁使用,而且也可能导致OutOfMemoryError异常

6、运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,
还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在加载后进入方法区的运行时常量池中存放。

7、程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条
线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程
之间计数器互不影响,独立存储。称之为“线程私有”的内存。程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。

8、执行引擎

虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码

9、垃圾收集系统

垃圾收集系统是Java的核心,也是不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需手工清理

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/84836317