《深入理解 java虚拟机》学习笔记
java内存区域详解
以下内容参考自《深入理解 java虚拟机 JVM高级特性与最佳实践》,其中图片大多取自网络与本书,以供学习和参考。
一、运行时数据区域
异常解释:StackOverflowError是指线程请求的栈深度大于虚拟机所允许的深度时所抛出的异常;OutOfMemoryError是指扩展时无法申请到足够的内存时所抛出的异常。
线程安全:
1.程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器通过改变计数器值来读下一条需要执行的字节码指令,如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined),是唯一没有规定OutOfMemoryError的区域。
2.java虚拟机栈:每个方法被执行时会同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口,方法调用的过程就是栈帧从入栈到出栈的过程。大多程序员所关注的栈内存,就是指的虚拟机栈中的局部变量表部分,其内存放了编译期可知的基本数据类型、对象引用(reference类型)和returnAddress类型(返回值类型),会抛StackOverflowError和OutOfMemoryError。见下图:
详细介绍请参考此网页:http://blog.csdn.net/zq602316498/article/details/38926607
3.本地方法栈:与虚拟机栈功能类似,区别:虚拟机栈为虚拟机执行java方法服务,而本地方法栈为Native方法服务。同样抛StackOverflowEror和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自带的虚拟机。
2.对象的创建
(1)虚拟机在遇到一条new指令时,先检查指令能否在常量池中定位到类的符号引用,并检查该类是否被加载、解析和初始化过,如果没有则执行相应的类加载过程,加载-验证-准备-解析-初始化。(2)虚拟机为新生对象分配内存。对象的内存在类加载完成后即可完全确定。分配java堆内存的方式有“指针碰撞”(带Compact过程的收集器)和“空闲列表”(基于Mark-Sweep算法的收集器)两种,选择哪种方式由java堆是否规整而决定的。(3)创建对象时的分配内存存在线程安全问题,其解决办法有两种,一种是对分配内存空间的动作进行同步处理;另一种是每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲(TLAB)。
3.对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据和对齐填充(HotSpot VM要求对象大小必须是8的整数倍,而对象头正好是8的倍数,因此当对象实例数据部分没有对齐时,需要通过对齐填充来补全)。
4.对象的访问定位
使用对象是通过栈上的reference数据来操作堆上的具体对象的,对象访问的方式取决于虚拟机实现而定。目前主流的访问方式有使用句柄和直接指针两种。
(1)通过句柄访问对象
(2)通过直接指针访问对象
三、异常实战
1.java堆溢出
2.虚拟机栈和本地方法栈溢出
3.方法区和运行时常量池溢出
4.本机直接内存溢出
《深入理解 java虚拟机》学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
随机推荐
- 记一次在java中的日期parse错误
String dateString = "2014101517"; new SimpleDateFormat("yyyyMMddHH").parse(dateS ...
- PHP unset()函数销毁变量 但没有实现释放内存
<?PHP $a = "hello";$b = &$a;unset( $b );echo $a; // 输出 helloecho $b; // 报错$b = &quo ...
- AC自动机+DP HDOJ 2457 DNA repair(DNA修复)
题目链接 题意: 给n串有疾病的DNA序列,现有一串DNA序列,问最少修改几个DNA,能使新的DNA序列不含有疾病的DNA序列. 思路: 构建AC自动机,设定end结点,dp[i][j]表示长度i的前 ...
- A*算法的原理 <转>
第一部分:A*算法简介 写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里 抛砖引玉,希望大家都来热心的参与. 还是说正题,我先拿A*算法开刀, ...
- jQuery的选择器中的通配符
(1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']");// ...
- Code[VS] 1230 题解
1230 元素查找 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过. 输入描述 Input Description 第一行两个整 ...
- 关于px、em和rem的学习笔记!
刚参加前端工作,字体一般使用px来设置大小,在处理响应式界面时对字体的大小变化处理感觉很吃力,得知对字体的大小有三种大小格式设置方式,便想一探究竟,希望可以有所帮助! px px像素(Pixel),相 ...
- Javascript初学篇章_7(DOM)
DOM 文档对象模型DOM (document object model) 文档对象模型,它定义了操作文档对象的接口.DOM 把一份html文档表示为一棵家谱树,使用parent(父), child( ...
- bzoj3048+3049+3050
这套月赛题不是特别难 T1:离散化+单调队列,队列里出现数的种类不超过K+1,找最大的num[a[i]] T2:一眼可以看出BFS+状压DP,还要SPFA预处理出各个块之间的dis T3:线段树,没什 ...
- 【JSOI2007】【Bzoj1029】建筑抢修
贪心... 按照T2来进行排序,用堆来进行维护.循环一遍,如果循环时间加上已用时间不超过截止时间,那就ANS++.否则,将它与堆顶判断,如果小于堆顶就把堆顶踢出,把它加入. #include<c ...