抽时间重新读了一遍《深入理解JVM》一书。以下为摘录内容。

1 java内存区域

java虚拟机运行时数据区

1.1 程序计数器

是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响。

1.2 java虚拟机栈

描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

局部变量表存放了编译器可知的各种基本数据类型、对象引用和returnAddress类型。

1.3 本地方法栈

虚拟机栈为虚拟机执行java方法服务,二本地方法栈为虚拟机使用到的Native方法服务。

1.4 java堆

被所有线程共享的一块内存区域,在虚拟机启动时创建。java堆是垃圾收集器管理的主要区域,因此很多时候也被叫做GC堆。

1.5 方法区

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

1.6 运行时常量池

方法区的一部分。需要注意的是string的intern方法在jdk1.6前后的不同。jdk1.6之后常量池放到了堆中。

1.7 直接内存

并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中国定义的内存区域。NIO引入的通道和缓冲区可以使用native函数库直接分配对外内存。

2 垃圾收集器与内存分配策略

2.1 判断对象是否存活的算法:

引用计数算法:很难解决对象之间相互循环引用的问题

可达性分析算法:通过一系列GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路线称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

2.2 垃圾收集算法

标记-清除算法:效率低,空间碎片化

复制算法:运行简单高效,代价高,降低了一半的使用率

标记-整理算法

分代收集:新生代用复制算法,老年代用标记整理算法

3 虚拟机类加载机制

加载、验证、准备、解析、初始化。

3.1 有且只有5种情况必须立即对类进行初始化

1)遇到new、getstatic、putstatic或invokestatic这4条指令字节码时,如果类没有进行过初始化,则需要先触发其初始化。

2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

3)当初始化一个类的时候,如果发现其父类还没有进行过初始化,需要先触发其父类的初始化。

4)当虚拟机启动时,需要制定main,虚拟机会先初始化main类。

5)当使用jdk1.7的动态语言支持时,如果java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。

3.2 类加载的过程

3.2.1 加载

1)通过一个类的全限定名来获取定义此类的二进制字节流

2)将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构

3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

3.2.2 验证

确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

文件格式验证——元数据验证——字节码验证——符号引用验证

3.2.3 准备

正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),二不包括实例变量。

3.2.4 解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

类和接口的解析、字段解析、类方法解析、接口方法解析

3.2.5 初始化

类初始化阶段是类加载过程的最后一步。在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序指定的主观计划去初始化类变量和其他资源,或者可以从另一个角度来表达:初始化阶段是执行类构造器<clinit>()方法的过程。

4 java内存模型

硬件的效率与一致性

java内存模型(JMM)

线程、主内存、工作内存之间的交互关系
java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。线程间变量值的传递均需要通过主内存来完成。

java内存模型时围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的。

  • 原子性:通过read、load、assign、user、store、write操作来保证。通过lock和unlock也可以满足。
  • 可见性:可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论普通变量还是volatile变量都是如此,普通变量与volatile变量的区别是,volatile的特殊规则保证了新值能够立即同步到主内存,以及每次使用前立即从主内存刷新。volatile保证了多线程操作时变量的可见性,二普通变量不能保证这一点。(synchronized和final关键字)
  • 有序性:volatile和synchronized保证线程之间操作的有序性,volatile本身就包含了禁止指令重排序的语义。

先行发生原则 保证了我们大多数情况下不用关心太多。

《深入理解JVM》读书笔记相关推荐

  1. 读书笔记 | 墨菲定律

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  2. 读书笔记 | 墨菲定律(一)

    1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...

  3. 洛克菲勒的38封信pdf下载_《洛克菲勒写给孩子的38封信》读书笔记

    <洛克菲勒写给孩子的38封信>读书笔记 洛克菲勒写给孩子的38封信 第1封信:起点不决定终点 人人生而平等,但这种平等是权利与法律意义上的平等,与经济和文化优势无关 第2封信:运气靠策划 ...

  4. 股神大家了解多少?深度剖析股神巴菲特

    股神巴菲特是金融界里的传奇,大家是否都对股神巴菲特感兴趣呢?大家对股神了解多少?小编最近在QR社区发现了<阿尔法狗与巴菲特>,里面记载了许多股神巴菲特的人生经历,今天小编简单说一说关于股神 ...

  5. 2014巴菲特股东大会及巴菲特创业分享

     沃伦·巴菲特,这位传奇人物.在美国,巴菲特被称为"先知".在中国,他更多的被喻为"股神",巴菲特在11岁时第一次购买股票以来,白手起家缔造了一个千亿规模的 ...

  6. 《成为沃伦·巴菲特》笔记与感想

    本文首发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明-- 沃伦·巴菲特传记的纪录片 http://www.bilibili.co ...

  7. 读书笔记002:托尼.巴赞之快速阅读

    读书笔记002:托尼.巴赞之快速阅读 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<快速阅读>之后,我们就可以可以快速提高阅读速度,保持并改善理解嗯嗯管理,通过增进了解眼睛和大脑功能 ...

  8. 读书笔记001:托尼.巴赞之开动大脑

    读书笔记001:托尼.巴赞之开动大脑 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<开动大脑>之后,我们就可以对我们的大脑有更多的了解:大脑可以进行比我们预期多得多的工作:我们可以最 ...

  9. 读书笔记003:托尼.巴赞之思维导图

    读书笔记003:托尼.巴赞之思维导图 托尼.巴赞的<思维导图>一书,详细的介绍了思维发展的新概念--放射性思维:如何利用思维导图实施你的放射性思维,实现你的创造性思维,从而给出一种深刻的智 ...

  10. 产品读书《滚雪球:巴菲特和他的财富人生》

    作者简介 艾丽斯.施罗德,曾经担任世界知名投行摩根士丹利的董事总经理,因为撰写研究报告与巴菲特相识.业务上的往来使得施罗德有更多的机会与巴菲特亲密接触,她不仅是巴菲特别的忘年交,她也是第一个向巴菲特建 ...

最新文章

  1. 【java线程】锁机制:synchronized、Lock、Condition
  2. 自建28核树莓派集群,顺便学学docker,这里有一个500美元的搭建方案
  3. s:if 标签 字符串比较 正确用法和错误用法
  4. VTK:图片之ImageVariance3D
  5. 就是这么流弊!三行Python代码,让数据处理速度提高2到6倍
  6. 记2018年9月PAT甲级考试(北京工业大学考场)
  7. flink的savepoint实验-scala
  8. Qt Widgets、QML、Qt Quick的概念与区别
  9. IoC反转控制初步认识
  10. powershell局域网内同步文件夹,文件脚本
  11. 【GD32F303开发之开发工具的安装与配置】
  12. 信息管理与信息系统毕业论文选题?
  13. linux下编写脚本文件 .sh
  14. Java工具类之String类
  15. VMware Ubuntu虚拟机非正常关机的恢复
  16. 快速排序的时间复杂度与空间复杂度
  17. javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)
  18. ogre1.9环境搭建
  19. HTML5 拖放Drag和drop用法以及事件介绍
  20. 美国访问学者签证材料清单

热门文章

  1. TCP/IP长连接和短连接
  2. ie6 插入图片img png24 阴影
  3. csc.exe的使用
  4. OpenCV2 图像叠加 给照片加水印
  5. 搞科研身体才是革命的本钱。
  6. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解
  7. 从零基础入门Tensorflow2.0 ----三、10. 近似求导
  8. ArcGIS加载Excel数据连接到数据库失败的解决办法
  9. c语言图像处理毕业设计,基于matlab数字图像处理毕业设计论文.doc
  10. 自然语言处理基本概念及基础工具