《深入理解 java虚拟机》学习笔记

时间:2022-09-06 20:50:12

java内存区域详解

以下内容参考自《深入理解 java虚拟机 JVM高级特性与最佳实践》,其中图片大多取自网络与本书,以供学习和参考。

《深入理解 java虚拟机》学习笔记

一、运行时数据区域

异常解释:*Error是指线程请求的栈深度大于虚拟机所允许的深度时所抛出的异常;OutOfMemoryError是指扩展时无法申请到足够的内存时所抛出的异常。

线程安全:

1.程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器通过改变计数器值来读下一条需要执行的字节码指令,如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined),是唯一没有规定OutOfMemoryError的区域。

2.java虚拟机栈:每个方法被执行时会同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口,方法调用的过程就是栈帧从入栈到出栈的过程。大多程序员所关注的栈内存,就是指的虚拟机栈中的局部变量表部分,其内存放了编译期可知的基本数据类型、对象引用(reference类型)和returnAddress类型(返回值类型),会抛*Error和OutOfMemoryError。见下图:

《深入理解 java虚拟机》学习笔记

详细介绍请参考此网页:http://blog.csdn.net/zq602316498/article/details/38926607

3.本地方法栈:与虚拟机栈功能类似,区别:虚拟机栈为虚拟机执行java方法服务,而本地方法栈为Native方法服务。同样抛*Eror和OutOfMemoryError。

4.直接内存:不是虚拟机运行时数据区的一部分,NIO类可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免了在java堆和Native堆中来回复制数据。直接内存会受到本机总内存大小及处理器寻址空间的限制。因此也会有OutOfMemoryError异常。

线程共享:

5.java堆(GC 堆):唯一目的是存放对象实例。是GC的主要区域,所以被称作“GC 堆”,堆可以被细分为:“新生代”和“老年代”会抛OutOfMemoryError。

6.方法区(非堆):存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。和堆一样内存可以不连续且大小可扩展或固定。这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,GC回收的条件苛刻,会抛OutOfMemoryError。

7.运行时常量池:运行时常量池是方法区的一部分,Class文件(字节码文件)中有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池存放,翻译出来的直接引用也存储在其中,具备动态性,运行期间也可将常量放入池中,例如String类的intern()方法,会抛OutOfMemoryError异常。

★常量池:Class文件中存储的信息。 运行时常量池:运行时常量池是随java虚拟机启动而被创建的。

运行时常量池是把Class文件常量池加载进来,每个类有一个独立的。刚开始运行时常量池里的链接都是符号链接,跟在Class文件里一样;边运行边就会把用到的常量转换成直接链接,例如说要Class A调用Foo.bar()方法,A.class文件里就会有对该方法的Methodref常量,是个符号链接(只有名字没有实体),加载到运行时常量池也还是一样是符号链接,等真的要调用该方法的时候该常量就会被resolve为一个直接链接(直接指向要调用的方法的实体)。

二、HotSpot虚拟机对象探秘

1.查看java虚拟机

运行cmd 2.输入java -version命令,见下图,可知运行的是HotSpot VM,这是JDK自带的虚拟机。

《深入理解 java虚拟机》学习笔记

2.对象的创建

(1)虚拟机在遇到一条new指令时,先检查指令能否在常量池中定位到类的符号引用,并检查该类是否被加载、解析和初始化过,如果没有则执行相应的类加载过程,加载-验证-准备-解析-初始化。(2)虚拟机为新生对象分配内存。对象的内存在类加载完成后即可完全确定。分配java堆内存的方式有“指针碰撞”(带Compact过程的收集器)和“空闲列表”(基于Mark-Sweep算法的收集器)两种,选择哪种方式由java堆是否规整而决定的。(3)创建对象时的分配内存存在线程安全问题,其解决办法有两种,一种是对分配内存空间的动作进行同步处理;另一种是每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB)。

3.对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充(HotSpot VM要求对象大小必须是8的整数倍,而对象头正好是8的倍数,因此当对象实例数据部分没有对齐时,需要通过对齐填充来补全)。

4.对象的访问定位

使用对象是通过栈上的reference数据来操作堆上的具体对象的,对象访问的方式取决于虚拟机实现而定。目前主流的访问方式有使用句柄和直接指针两种。

(1)通过句柄访问对象

《深入理解 java虚拟机》学习笔记

(2)通过直接指针访问对象

《深入理解 java虚拟机》学习笔记

三、异常实战

1.java堆溢出

2.虚拟机栈和本地方法栈溢出

3.方法区和运行时常量池溢出

4.本机直接内存溢出

《深入理解 java虚拟机》学习笔记的更多相关文章

  1. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  2. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  3. 深入理解Java虚拟机学习笔记(一)-----Java内存区域

    一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  4. 深入理解Java虚拟机 - 学习笔记 1

    Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...

  5. 深入理解java虚拟机学习笔记(二)

    第三章 垃圾收集器与内存分配策略 概述 ​ 程序计数器.虚拟机栈.本地方法栈3个区随线程而生,随线程而灭.因此大体上可认为这几个区域的内存分配和回收都具备确定性.在方法/线程结束时,内存自然就跟着回收 ...

  6. 深入理解java虚拟机学习笔记(一)

    第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ...

  7. 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制

    第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...

  8. 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略

    写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...

  9. 类加载机制(深入理解JAVA虚拟机学习笔记)

    1.类加载机制的定义 将class文件加载到内存,然后对class文件中的数据进行校验.解析和初始化,转换成可以被虚拟机直接使用的JAVA类型,这就是虚拟机的类加载机制.(在JAVA中,类的加载.连接 ...

  10. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

随机推荐

  1. &lpar;原创&rpar;ssm sql 例子&lpar;freemarker&plus;jsp&rpar;

    ssm整合地址:http://www.cnblogs.com/xiaohuihui96/p/6104351.html 接下讲解一个插入语句的流程和顺带讲解freemarker+jsp视图的整合 初次接 ...

  2. &lbrack;moka同学笔记&rsqb;Yii2 数据操作Query Builder 2

    Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...

  3. DirectoryBrowserMiddleware中间件如何呈现目录结构

    DirectoryBrowserMiddleware中间件如何呈现目录结构 和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义 ...

  4. mybatis 多个dao重名,根据namespace解析

    在mybatis通过执行sql语句的方式是,用getSqlSession().xxx(param,..)方法来调用, 其中第一个参数就是dao mapper.xml文件的命名空间.id package ...

  5. windows 下删除&period;svn文件

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] @= ...

  6. C&plus;&plus;中的Traits技法

    Traits广泛应用于标准程序库.Traits classes使得"类型相关信息"在编译期可用. 认真读完下面的示例,你应该就懂了Traits技法,其实并不难. #include ...

  7. devops基本流程

    概要 源代码管理: 工具:Subversion (SVN) Concurrent Version System (CVS) Git SCCS Revision control systems Bitb ...

  8. Leetcode - 517 Super Washing Machines

    今天开始定期记录本人在leetcode上刷题时遇到的有意思的题目.   517. Super Washing Machines   You have n super washing machines ...

  9. pymongo

    import pymongofrom bson import ObjectIdimport jsonmongo_client=pymongo.MongoClient(host='127.0.0.1', ...

  10. php排序算法及二分法查找

    插入排序 思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立 ...