《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记

JAVA 环境:


JAVA虚拟机高级特性:

一:java内存区域与内存异常

一):运行数据区

    1:程序计数器(Program Counter Register),也称"PC寄存器"

A:用来指示需要执行哪条指令的。(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。)

B:由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的。每个线程都有独立的程序计数器,属               于私有的。

C:如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是               Native方法,则程序计数器中的值是undefined。

D: 由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会             发生内存溢出现象(OutOfMemory)的。

   2:虚拟机栈(VM Stack),也称 Java栈

A:每个方法执行都会创建一个栈帧(Stack Frame),用于存储局部变量表,操作数栈,常量引用,动态链接,              方法出口等其他附加信息;-Xss参数设定。

        B:对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量             表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。

        C:如果线程请求大于虚拟机允许的深度,将抛出StackOverflowError;如果虚拟机栈可以动态扩展(也允许               固定长度),扩展时内存不够,就抛出OutOfMemoryError。

3:本地方法栈(Native Method Stack)

A:与虚拟机栈作用相似,区别就是它为Native方法服务的;

B:有的虚拟机(如Sun HotSpot)把本地方法栈和虚拟机栈合二为一;

   4:堆(Heap),即java堆

A:Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的);

         B:Java堆是垃圾收集器管理的主要区域,Java堆在虚拟机启动时创建,被所有线程共享;

         C:Java堆里面分为:新生代和老生代;

         D:在实现时,既可以是固定大小又可以是可扩展的(通过-Xmx和-Xms控制,设置一样就不能自动扩展),  如               果堆内存不够将会抛出OutOfMemoryError;

5:方法区(Method Area)

A:在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译                    器编译后的代码等。

B:别名 Non-Heap ,非堆;目的应该是区别java堆;设置-XX:PermSize和-XX:MaxPermSize限制方法区                  大小;
            C:HotSpot上很多人习惯把方法区看做“永久代”,但是本质上两者并不等价!
                 HotSpot是使用永久代来实现方法区的,这样GC就可以像管理Java堆一样地管理方法区了,省去了为                    方法区编写内存管理的代码。但其他虚拟机(JRockit,J9等)来说是不存在永久代的;原则上如何实现方                    法区,不受虚拟机规范约束;对于HotSpot现在也有放弃永久代并逐步改为Native Memory来实现方                  法区的规划了;jdk1.7的HotSpot中已经把原本放在永久代的字符串常量池移除;

D:方法区无法满足内存分配时,将抛出OutOfMemoryError;

E:运行时常量池时方法区的一部分;

6:直接内存,受物理内存大小限制;

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

    1:程序计数器、虚拟机栈、本地方法栈都是随着线程而生,随线程而消亡;需要回收的是堆和方法区;

2:对象已死吗?对象已经被回收了吗?

1) 引用计数法:给对象添加一个引用计数器,每当对象有个引用,计数器就加1,引用失效就减1,当引用计                数器为0时,该对象就不可能再被使用了(回收)(很多人的答an)。
             但是,至少主流的java虚拟机没有使用这种算法来管理内存,主要原因是它很难解决对象之间的循环引用。

2)可达性分析算法:主流都是通这个算法来判断对象是否存活。
           这个算法基本思想就是通过一些列的‘GC Roots‘的对象作为起始点,从这些节点开始往下搜索,搜索所走过            的路径成为‘引用链‘,当一个对象到GC Roots没有任何引用链死,就是从GC Roots到这个对象不可达。则证            明这个对象不可用,这些对象将被判定可回收。
            但这些对象不是‘非死不可‘(缓刑阶段),要宣告一个对象死亡,至少要经历两次标记。GC Roots不可达将会            进行第一次标记且进行一次筛选,筛选的条件就是此对象有没有必要执行finalize()方法,当对象没有覆盖              finalize()或finalize()被虚拟机调用过,这两种情况虚拟机视为"没有必要执行"。此外就是有必要执行,那              么这个对象就是会被放入F-Queue的队列中,finalize()方法是对象逃脱死亡的最后一次机会(把对象赋值给            某个变量);稍后GC对F-Queue中的对象进行小规模的第二次标记,被两次标记对象真的要被回收了。

3)回收方法区:

A:java虚拟机规范可以不要求虚拟机在方法区实现垃圾收集,方法区(永久代)垃圾收集效率比较低。

B:永久代垃圾收集分为两部分:废弃常量和无用的类。
               回收废弃常量和回收java堆中对象非常类似,但常量没有其他地方引用就会被移除常量池(回收),方法区                中的类(接口)字段等符号引用也是如此。
              满足以下3个条件才算是‘无用的类‘:(是否被回收,虚拟机提供了一些设置参数)
             1:该类的所用实例都已经被回收
             2:加载该类的ClassLoader已经被回收
             3:该类对应的java.lang.Class对象没有任何地方被引用,无法通过发射访问该类的方法

4)垃圾收集算法:

A:标记-清除算法:分为标记和清除两个阶段。有两个问题1:效率不高 2:会产生大量不连续的内存碎片。

B:复制算法:运行高效。

C:标记-整理算法:老年代一般使用这种算法 。

D:分代收集算法:
                当前商业虚拟机的垃圾收集都采用分代收集;
                根据对象存活周期的不同把内存划分为几块;
                一般是把java堆分为新生代和老年代,根据各个年代特点采用不同算法,
                在新生代,每次垃圾收集就有大量对象死去,所以采用复制算法;
                在老年代,对象存活率较高,就采用标记-清除或标记-整理算法;

5)垃圾收集器:如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是具体实现;有好7种。

A:Serial收集器:单线程的。发展历史最悠久的收集器。简单高效,jdk1.3之前 新生代的唯一选择。

B:ParNew收集器:Serial的多线程版;是运行在Service模式下的虚拟机中首先的新生代收集器。jdk1.3

C:Parallel Scavenge收集器:使用复制算法的新生代收集器,又是并行的多线程收集器;jdk1.4。

D:Serial Old收集器:是Serial送机器的老年代版本,单线程,使用标记-整理算法,主要意义在于给                                                  Client模式下的虚拟机使用;jdk1.5

E:Parallel Old收集器:Parallel Scavenge收集器老年代版本,多线程,采用标记-整理的算法;jdk1.6

F:CMS收集器:是以获取最短回收停顿时间为目标的收集器,基于标记-清除算法。并发收集低停顿.jdk1.5

J:G1收集器:jdk1.7中,面向服务端应用的垃圾收集器,未来可能替换掉CMS收集器;

特点:1并行与并发;2分代收集;3空间整合;4可预测的停顿;
                               运作步骤:1:初始标记;2:并发标记;3:最终标记;4:筛选回收;

6)内存分配与回收策略:

A .对象优先在Eden上分配:

大多数情况下,对象在新生代Eden上分配,但Eden上没有空间了,虚拟机会发起一次Minor GC(发生在新             生代垃圾收集动作,比较频繁,一般回收速度快);老年代GC(Major GC 或Full GC),发生在老年代的                 GC,出现了Major GC ,经常会伴随至少一的 Minor GC(但非绝对);

B.大对象直接进入老年代:大对象就是需要大量连续内存空间的java对象,最典型的就是较长的字符串以及数组

C.长期存活的对象将进入老年代:

有个对象年龄计算器,每熬过1次Minor GC 年龄就加1岁,当年龄到达默认值(15岁)就会晋升到老年代中,              这个年龄阀值可以通过设置-XX:MaxTenuringThreshold;

写博客有点累,未完待续》。。

时间: 2024-12-25 18:05:50

《深入理解Java虚拟机 JVM高级特性...》核心笔记的相关文章

挑战高薪必看:《深入理解java虚拟机 jvm高级特性与最佳实践》

Java是目前用户最多.使用范围最广的软件开发技术之一.Java 的技术体系主要由支撑 Java程序运行的虚拟机.提供各开发领域接口支持的Java API.Java 编程语言及许多第三方 Java框架(如Spring.Struts 等)构成.在国内,有关Java API.Java语言语法及第三方框 架的技术资料和书籍非常丰富,相比之下,有关Java虚拟机的资料却显得异常贫乏. 资料获取方法 内容特色 第一部分走近 Java 本书的第部分为后文的讲解建立了良好的基础.尽管了解Java技术的来龙去脉

《深入理解Java虚拟机:JVM高级特性与最佳实践》学习笔记 Ⅲ 虚拟机执行子系统

第三部分 虚拟机执行子系统第6章 类文件结构//实现语言无关性的基础仍然是虚拟机和字节码存储格式,使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合Class文件应有的结构就可以在Java虚拟机中运行.1.Class类文件的结构Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有分隔符.Cl

深入java虚拟机-jvm高级特性和实战

第一部分 走近java 第一章 java技术体系 官方所定义的java技术体系 java程序设计语言 各硬件平台上的java虚拟机 Class文件格式 java api类库 来自商业机构和开源社区的第三方java类库 我们可以把java程序设计语言.java虚拟机.java api类库这三部分统称为JDK,是用于支持java程序开发的 最小环境把java api类库总的javaSE api子集和java虚拟机统称为JRE,是支持java程序运行的标准环境. 第二部分 自动内存管理机制 第二章 内

深入Java虚拟机JVM类加载初始化学习笔记

1. Classloader的作用,概括来说就是将编译后的class装载.加载到机器内存中,为了以后的程序的执行提供前提条件. 2. 一段程序引发的思考: 风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误. 一般不假思索的结论就是,a=1,b=1.给出的原因是:a.b都是静态变量,在构造函数调用的时候已经对a和b都加1了.答案就都是1.但是运行完后答案却是a=1,b=0. 为什么呢,这3句无非就是静态变量的声明.初始化,值的变化和声明的顺序还有关系吗?Java

《深入理解java虚拟机-高效并发》读书笔记

Java内存模型与线程 概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能,多任务运行是压榨手段,就如windows一样,我们使劲的压榨它运行多个任务,俱要high又要耍.并发则是另外一种更具体的应用场景.每秒事物处理数(Transactions per Second,tps)是最重要的指标.开发人员应该了解与运用并发. 硬件的效率与一致性 除了有软件上的并发,物理计算机也有并发问题.计算机的存储设备与处理器运算速度有几个数量级的差距,现代计算机都不得不加入一层高速缓存来作为内存与处理

《深入理解java虚拟机JVM的高级特性及其实现原理》

JVM的优点(JAVA语言的优点) 除了要了解java语言的优点之外,还要知道java语言的这些优点到底是如何实现的(也即java语言这些特性的实现原理)

深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载

网盘下载地址:深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)PDF下载 – 易分享电子书PDF资源网 作者: 周志明 出版社: 机械工业出版社 副标题: JVM高级特性与最佳实践 出版年: 2013-9-1 页数: 433 定价: 79.00元 装帧: 平装 内容简介 · · · · · · <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公

深入理解Java虚拟机到底是什么

摘自:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的

(1) 深入理解Java虚拟机到底是什么?

好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的.但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了.在本文中,我会写下我对虚拟机的理解.因为能力所限,可能有些地方描述的不够欠当.如果你有不同的理解,欢迎交流. 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到