第二章:Java内存区域与内存溢出异常

一、运行时数据区域

首先上图,想必大家都很想吐槽,这张图我都要看烂了。

程序计数器

线程私有

它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能,均需要依赖这个计数器来完成。

虚拟机栈

线程私有

虚拟机栈也就是我们常说的堆栈中的栈。多指局部变量表和TLAB(Thread Local Allocation Buffer:线程私有的分配缓冲区)。

每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在JVM栈中从入栈到出栈的过程。这就意味着虚拟机栈的生命周期与线程相同

本地方法栈

本地Native服务。

Java堆

线程共享

堆得描述为:“ 所有对象的实例以及数组都应当在堆上分配 ”。
因此也会有资料称呼Java堆为GC堆。

方法区

线程共享。

用于存储已被虚拟机加载的类型信息、常量、静态常量、即时编译后的代码缓存等数据。

永久代历史介绍
说到方法区,就不得不说一下永久代。

JDK8以前,许多程序员都喜欢称呼方法区为永久代,其实这两者并不是等价的。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 同时大多数用的JVM都是Sun公司的HotSpot。在HotSpot上把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。换句话说:方法区是一种规范,永久代是Hotspot针对这一规范的一种实现。

而从现在回顾以前,当年使用永久代来实现方法区并不是一个好主意,这导致了Java应用更容易遇到内存溢出OOM(永久代 -XX:MaxPermSize 的上限,即使不设置也有默认大小。而J9和JRockit只要没有触碰到进程可用内存上限,如32位系统中4GB限制,就不会出问题,因为J9和JRockit不存在永久代这种说法)。例如使用String::intern(); 最后会解释。

当Oracle收购了BEA的JRockit的所有权后,准备把JRockit的优秀的功能,移植到HotSpot中,但由于二者方法区的实现不同,存在诸多的困难,但考虑到HotSpot未来的发展,

HotSpot的开发团队在JDK6的时候,就有计划放弃永久代,逐步改为采用本地内存来实现方法区了。

到了JDK7,已经把原本放在永久代的字符串常量池、静态变量等移出。

而到了JDK8,最终完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间来代替,把JDK7中永久代剩余的内容,主要是类型信息全部移到元空间中。

回到刚刚说起的 String::intern(); jdk7 版本对 intern 操作和常量池都做了一定的修改。主要包括2点:
(1)将String常量池 从 Perm 区移动到了 Java Heap区。
(2)String::intern() 方法,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。

运行时常量池(方法区一部分)

编译期生成的各种字面量与符号引用。

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

直接内存

并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。这里讲到是因为JDK1.4新加入了NIO,它可以使用Native函数库直接分配堆外内存。

显然,本机的直接内存不会受到Java堆得大小限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数的时候,会根据实际内存区设置 -Xmx 等参数信息,但经常忽略直接内存,使得各个区域总和大于物理内存限制(包括物理和操作系统级的限制),从而导致动态扩展是出现OutOfMemoryError异常。

总结:

深入理解Java虚拟机(周志明)——读书笔记1相关推荐

  1. 【机器学习】周志华 读书笔记 第一章 绪论

    1..什么是机器学习? 引言部分关于各种情景,是基于经验做出的的预判,机器学习的本质任务是预测. 特征 学习经验          =>从而做出有效的决策 def:① 机器学习是一门学科, ②  ...

  2. 机器学习——周志华读书笔记

    1.模型评估方法: 留出发:数据集分割为两部分,data=测试集+训练集:2/3~4/5作为训练集,其余测试集 交叉验证:数据集分割为k组,k-1组为训练集,剩余1组为测试集.共k中情况,对k种情况的 ...

  3. 西瓜书周志华读书笔记

  4. 《机器学习》周志华 读书笔记2(原创)

    第2章 模型评估与选择 p24-p51  2017-2-24 Fri Model selection模型选择:选用哪种学习算法.使用哪种参数配置 (理想的解决方案:对候选模型的泛化误差进行评估,再选择 ...

  5. 西瓜书(机器学习 周志华)读书笔记--第一章 绪论

    1.1 引言 略 1.2 基本术语 1.2.1 数据集相关的基本概念 假定我们收集了一批关于西瓜的数据,例如(色泽=青绿;根蒂=蜷缩;敲声=浊响), (色泽=乌黑;根蒂=稍蜷;敲声=沉闷), (色泽= ...

  6. 深入理解Java虚拟机 - 字节码指令集

    Java虚拟机的指令由一个字节长度的. 代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成. 字节码与数据类型 在J ...

  7. 深入理解java虚拟机-1.自动内存管理

    文章目录 1.自动内存管理 1.1 Java内存区域与内存溢出异常 1.1.1 运行时数据区域 程序计数器 程序计数器为什么是私有的? java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈为什么是私有的 ...

  8. 深入理解Java虚拟机02—类加载机制

    文章目录 1 类加载过程 1.1 加载 1.2 连接 1.2.1 验证 1.2.2 准备 1.2.3 解析 1.3 初始化 2 类加载器 2.1 类加载器 2.2 双亲委派模型 2.3 破坏双亲委派模 ...

  9. 深入理解Java虚拟机-高效并发

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

  10. 深入理解Java虚拟机-走近Java

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

最新文章

  1. 理解JavaScript原型链
  2. 访问SAP时提示报错SAP GUI for Windows 720窗口
  3. 在EXT中向弹窗传值或者对象
  4. python删除为空值的列_python如何删除列为空的行
  5. PLSQL Developer 出现ORU-10027: buffer overflow, limit of 10000 bytes
  6. 使用 cf push 部署应用到 SAP BTP 后启动失败 start unsuccessful 该如何处理
  7. 开源openstack_使用4个OpenStack指南和教程构建开源云
  8. 嵌入式系统——电子设计
  9. 利用jsp设计一个简单计算器 (加减乘除)
  10. 基于Python的Bangumi中动画片排行榜数据可视化分析
  11. 表格说超链接危害计算机怎么办,win10系统excel表格中的超链接打不开提示“由于本机限制”的处理教程...
  12. 使用Adb shell dumpsys检测Android的Activity任务栈
  13. Blast 几种方法的具体用法以及含义
  14. 【Python】使用日历热图进行时序数据可视化
  15. html表格翻页简单,利用jQuery实现一个简单的表格上下翻页效果
  16. win10 microsoft edge 浏览器收藏夹位置
  17. 运营干货!分销系统怎么做?
  18. 生物信息学: 使用python包GOATOOLS查询GO
  19. python网络爬虫从入门到实践 第5章 (二)
  20. 姬魔恋战纪服务器维护,《姬魔恋战纪》11月7日更新公告

热门文章

  1. http://www.hi-donet.com/网站
  2. 脱离.Net Framework运行doNet程序的简单方法
  3. EOS智能合约开发系列(二)
  4. 解决M1芯片mac安装AU( Audition2020)AU2020已适配M1芯片,M1处理器安装AU教程方案
  5. Qt:QTableView(01) 的用法
  6. 深入解析 Apache BookKeeper 系列:第四篇—背压
  7. 计算机电池电源转换,图吧小白教程 篇七十七:只需一步,延长MACBOOK电池寿命(硬改电源)...
  8. 【linux】循序渐进学运维-基础篇-linux运维级别
  9. Centos7防火墙与IPTABLES详解
  10. MFC-CListCtrl重绘,添加按钮到单元格