`

JVM学习笔记(一)——JAVA内存区域

    博客分类:
  • JVM
阅读更多
最近开始学习JVM,在此把学习中的体会记录下来。资料主要来源是《深入理解JAVA虚拟机》这本书,以及一些网上找的其他资料。目标JVM是HotSpot

1、JAVA运行时数据区包括程序计数器、堆、虚拟机栈、本地方法栈、方法区

2、内存区域可以分为“线程私有”和“线程共享”2种。比如程序计数器是属于线程私有的,为了在线程切换之后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器;而堆是线程共享的

3、程序计数器是一块较小的内存空间,可以看作是当前线程执行的字节码的行号指示器。如果线程正在执行一个JAVA方法,该计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行一个NATIVE方法,该计数器值为空

4、虚拟机栈也是线程私有的,生命周期与线程相同

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

6、虚拟机栈中的局部变量表,存放编译期可知的各种基本数据类型、对象引用和returnAddress类型

7、本地方法栈与虚拟机栈类似,区别在于虚拟机栈为JAVA方法(也就是字节码)服务,而本地方法栈为虚拟机用到的NATIVE方法服务

8、鉴于本地方法栈和虚拟机栈十分相似,HotSpot直接将本地方法栈和虚拟机栈合二为一

9、JAVA堆是线程共享的内存区域,在虚拟机启动时就创建。该内存区域的唯一目的是存放对象实例,几乎所有的对象实例都在这里分配内存

10、JAVA堆也是垃圾收集器管理的主要区域,所以有时也被称为GC堆。JAVA堆可以细分为新生代和老年代;也可以进一步细分为Eden空间、From Survivor空间、To Survivor空间

11、方法区也是线程共享的内存区域。它用于存放已经被虚拟机加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据。虽然JAVA虚拟机规范将方法区描述为堆的一个逻辑部分,但是它却有一个别名叫NonHeap,目的应该是与JAVA堆区分开来

12、方法区的内存回收目标主要是针对常量池的回收和对类型的卸载

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

14、即使是最简单的访问,也会涉及JAVA栈、JAVA堆、方法区这3个最重要的内存区域之间的关联关系
Object obj = new Object();

Object obj这部分的语义会反映到虚拟机栈的本地变量表中,作为一个reference类型数据出现
new Object()这部分的语义会反映到JAVA堆中,形成一块存储了Object类型所有实例数据值的结构化内存
在JAVA堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中

15、由于reference类型在JAVA虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位,以及访问JAVA堆中的对象的具体位置,所以不同虚拟机实现的对象访问方式会有所不同。主流的访问方式有2种:使用句柄,和直接指针

16、如果使用句柄访问方式,JAVA堆中会划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含对象实例数据和类型数据各自的具体地址信息


17、如果使用直接指针访问方式,JAVA堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址


18、使用句柄访问方式的好处是reference中存储的是稳定的句柄地址,在对象被移动时(比如在垃圾收集的时候)只会改变句柄中的实例数据指针,reference本身不需要修改。使用直接指针访问方式的好处是速度更快,节省了一次指针定位的时间开销,由于对象的访问在JAVA中非常频繁,因此这类开销积少成多以后也相当可观

19、HotSpot是使用直接指针访问方式进行对象访问的
  • 大小: 45.3 KB
  • 大小: 40.8 KB
1
10
分享到:
评论

相关推荐

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Java JDK 6学习笔记——ppt简体版.rar

    这份"Java JDK 6学习笔记——ppt简体版"提供了关于这个关键版本的详细教程,适合初学者和有一定经验的开发者来深入理解Java编程。 首先,我们要了解Java JDK是什么。Java Development Kit,简称JDK,是Oracle公司...

    JVM学习笔记核心知识点整理

    ### JVM学习笔记核心知识点整理 #### 一、引言与背景 随着软件开发技术的不断发展,Java作为一种广泛应用的编程语言,其背后的核心技术——Java虚拟机(JVM)的重要性日益凸显。掌握JVM不仅可以帮助开发者更好地理解...

    java学习——java中的反射学习笔记.rar_java 反射

    1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类的Class对象。这个对象包含了关于类的所有信息,包括方法、字段、构造器等。例如,`Class<?> clazz = Class.forName("com.example.MyClass");` 2. 获取...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6学习笔记是Java初学者入门的重要参考资料,它以PPT的形式提供了一种直观易懂的学习途径。这份笔记涵盖了Java编程语言的...因此,这份"Java JDK 6学习笔记——ppt简体版"对于Java初学者来说是一份宝贵的资源。

    学习笔记——资料

    【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...

    学习笔记——JVM性能调优之 jstat(csdn)————程序.pdf

    在进行JVM性能调优时,`-gcutil`选项尤其重要,因为它能直观地反映出各个内存区域的利用率,如Eden区(E)、Survivor区(S0, S1)、老年代(O)和元空间(M)等。通过观察这些指标,开发者可以判断是否存在内存泄漏...

    JVM笔记(阳哥).zip

    此外,JVM还有一块特殊的内存区域——方法区,用于存储类的信息,如类的静态变量和常量池等。理解这些内存区域的划分和工作方式,对于优化内存使用和避免内存泄漏至关重要。 三、类加载机制 JVM的类加载机制包括...

    【达内】听课笔记之二——JAVA

    它以其“一次编写,到处运行”的特性而闻名,因为Java代码可以跨平台运行,只需一个Java虚拟机(JVM)支持。本节的听课笔记将深入探讨Java的核心概念和技术。 一、Java语言基础 1. 变量与数据类型:Java提供了基本...

    个人学习的java笔记——思维导图

    这份"个人学习的java笔记——思维导图"是作者学习Java过程中的总结,通过思维导图的形式,将复杂的概念和知识结构化,便于理解和记忆。下面,我们将深入探讨其中涉及的一些关键知识点。 1. **基础语法**:Java的...

    java jdk5.0学习笔记——良葛格

    良葛格的《Java JDK5.0学习笔记》是一本面向初学者的教程,旨在帮助读者掌握这个版本的核心概念和技术。以下是基于该书部分内容的知识点详解: 1. **泛型**:JDK 5.0引入了泛型,这是一种强大的类型系统增强,允许...

    Java,JVM相关笔记的代码知识

    这份JVM相关的笔记包含了深入理解JVM内部工作机制的关键代码资源,是学习和优化Java应用程序的重要参考资料。下面,我们将深入探讨Java与JVM的相关知识点。 1. **类加载机制**:JVM通过类加载器(ClassLoader)将...

    MLDN学习笔记 —— Annotation

    《MLDN学习笔记——Annotation》这篇博文主要探讨的是在编程领域中,特别是Java语言中,关于Annotation(注解)的深入理解和应用。Annotation是Java语言提供的一种元数据,它为程序提供了额外的信息,这些信息可以被...

Global site tag (gtag.js) - Google Analytics