《深入理解JAVA虚拟机》--第二章 Java内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的呢存划分为若干个不同的数据区域。

如图所示

《《深入理解JAVA虚拟机》--第二章 Java内存区域》

1,程序计数器

一块较小的内存空间,作用:当前线程所执行的字节码的行号指示器。线程私有的内存。

Java的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,因此,每个线程为了能在切换后能恢复到正确的位置,每个线程需要独立的程序计数器。

2,Java虚拟机栈

也是线程私有

虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

3,本地方法栈

与虚拟机栈相似,区别:虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

4,Java堆

Java堆是Java虚拟机所管理的内存中最大的一块。是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。

Java堆是垃圾收集器管理的主要区域,因此很多时候也叫GC堆

不需要连续内存,可以选择固定大小,可扩展

5,方法区

与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

选择不实现垃圾收集(永久代)

6,运行时常量池

方法区一部分用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中

7,直接内存

不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但这部分内存也被频繁使用

说明:Native方法:ava不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同C程序的接口。

JNI编程也就是在Java中调用C++程序,实现Java语言和Native语言之间进行交互。

对象访问过程的内存分配

Object obj=new Object();

Obeject obj Java栈,这部分语义将会反映到java的本地变量表中,作为一个reference类型数据出现。

new Object() 这部分语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值的结构化内存,同时还必须包含能查找到此对象类型数据的地址信息,这些类型数据存储在方法区

reference类型在Java虚拟机规范里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java堆中的对象的具体位置

主流访问方式两种:

1,使用句柄访问

Java堆中划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息

《《深入理解JAVA虚拟机》--第二章 Java内存区域》

2,使用直接指针访问

reference中直接存储的就是对象地址

《《深入理解JAVA虚拟机》--第二章 Java内存区域》

    原文作者:java虚拟机
    原文地址: https://blog.csdn.net/lskyne/article/details/8989551
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞