JAVA虚拟机_葛一鸣

第一章 初探Java虚拟机

跨平台的真相:Java虚拟机
所谓虚拟机,就是一台虚拟的计算机.它是一款软件,用来执行一系列虚拟计算机指令.虚拟机可以分为系统虚拟机程序虚拟机.程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而执行,在Java虚拟机中执行的指令我们称为Java字节码指令.

一切看我的:Java语言规范
Java的数据类型分为原始数据类型引用数据类型.原始数据类型又分为数字型和布尔型.数字型又有byte,short,int,long,char,float,double.注意这里char被定义为整数型,并且在规范中明确定义:byte, short, int, long分别是8位, 16位, 32位, 64位有符号整数.
引用数据类型分为三种:类或接口, 泛型类型和数组类型.
一切听我的:Java虚拟机规范
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制.

第二章 认识Java虚拟机的基本结构

谋全局者才能成大器:看穿Java虚拟机的架构
类加载子系统:负责从文件系统或网络中加载Class信息,将类信息及常量池信息存于方法区
方法区:存放类信息及常量池信息
Java堆:存放对象实例,堆空间线程共享
直接内存:Java的NIO库允许Java程序使用直接内存.访问速度优于Java堆.读写频繁的场合可能考虑使用直接内存.
垃圾回收系统:可以对方法区,Java堆和直接内存进行回收.其中,Java堆是垃圾收集器的工作重点.
Java栈:每个Java虚拟机线程都有一个私有的Java栈.Java栈中存放着帧信息,保存着局部变量,方法参数,同时和Java方法的调用,返回密切相关.
本地方法栈:与Java栈类似,最大不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用.
PC寄存器:每个线程私有.在任意时刻,一个Java线程总是在执行一个方法,即当前方法.
执行引擎:负责执行虚拟机的字节码.

对象去哪儿:辨别Java堆
堆空间的一般结构:新生代(eden, s0, s1或eden, from, to)和老年代(tenured);s0和s1是两块大小相等,可以互换角色的内存空间.

栈上分配:对于那些线程私有的对象(这里指不可能被其他线程访问的对象),可以将他们打散分配在栈上,而不是分配在堆上.在函数调用结束后自行销毁,不需垃圾回收器的介入,从而提高系统的性能.

类去哪儿了:识别方法区

第三章 常用的虚拟机参数

-Xlog:gc 打印GC日志
-verbose:class 跟踪类的加载和卸载
-Xms 指定初始堆空间(Java进程启动时,虚拟机就会分配一块初始堆空间)的大小
-Xmx 指定最大堆空间(初始堆空间耗尽,虚拟机对堆空间扩展上限)
-Xmn 新生代大小

堆内存溢出:在Java程序运行过程中,如果堆空间不足,则有可能给抛出内存溢出错误,简称OOM(Out Of Memory).

第四章 垃圾回收的概念与算法

内存管理清洁工:认识垃圾回收
内存泄漏: 某处内存没有释放, 例如new一个对象, 但是该对象没有被使用,需要delete释放
内存溢出: 垃圾对象所耗内存空间持续增大, 超过内存大小便溢出.

清洁工具大PK: 讨论常用的垃圾回收算法
引用计数法:
实现:为每个对象配备一个计数器,被引用则加一,当引用失效,则减一.当该对象的引用计数器值为0,则对象就不可能在被使用. 存在的问题:(1)循环问题:无法处理循环引用. (2)性能问题:引用计数器要求在每次引用产生和消除的时候,伴随着一个加法操作和一个减法操作,对系统的性能有一定的影响.
标记清除法:
先通过根节点标记所有的可达对象,然后清除所有的不可达对象,完成垃圾回收.
标记清除法是现代垃圾回收算法的思想基础.标记清除法将垃圾回收分为两个阶段:标记阶段和清除阶段.
标记阶段:首先通过根节点标记所有从根节点开始的可达对象.因此未被标记的对象就是未被引用的垃圾对象.然后,在清除阶段,清除所有未被标记的对象.
问题: 可能产生空间碎片
复制算法:
复制算法的核心思想是:将原有的内存空间分为两块,每次只使用其中一块,在进行垃圾回收时,将正在使用的内存中的存活的对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收.
对于系统中垃圾对象多的区域,复制算法(1)效率高(2)没有碎片.缺点:将系统内存折半,造成空间浪费.
Java新生代串行垃圾回收器:如eden区和from区存活对象复制到to区,剩余的对象是垃圾对象,可直接清空.
标记压缩法:
在老年代,大部分对象都是存活对象.
标记压缩法是一种老年代的回收算法.它在标记清除法的基础上做了一些优化.和标记清除法一样,标记压缩法首先需要从根节点开始,对所有可达对象做一次标记.但之后,它不是简单的清理未标记的对象,而是将所有存活对象压缩到内存的一端.然后清理边界外所有的空间.这种方法既避免了碎片的产生,又不需要两块相同的内存空间,性价比比较高.
标记压缩法的最终效果等同于标记清楚法执行完成后再进行一次内存碎片整理,因此,也可称之为标记清除压缩法.
分代算法:
将内存区间根据对象的特点分成几块,根据每块内存空间的特点使用不同的回收算法,以提高垃圾回收的效率.
分代回收的思想:内存分代–新生代(复制算法),老年代(标记压缩法).
新生代回收的频率很高,但是每次回收的耗时很短;而老年代回收的频率比较低,但是会消耗更多的时间.为了支持高频率的新生代回收,虚拟机使用一种叫作卡表的数据结构.卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用.这样在新生代GC时,可以不用花大量时间扫描所有的老年代对象来确定每一个对象的引用关系,可以先扫描卡表,只有当卡表的标记位为1时,才需要扫描给定区域的老年代对象,而卡表位为0的老年代对象,一定不含新生代对象的引用.
分区算法:
分代算法将对象按照生命周期长短划分为两个部分,分区算法将整个堆空间划分成连续不同小区间,每一个小区间独立使用,独立回收.

谁才是真正的垃圾:判断可触及性
可触及性包含三种状态:

- 可触及的: 从根节点开始,可以达到这个对象
- 可复活的: 对象的所有引用都被释放, 但是对象有可能在finalize()函数中复活
- 不可触及的: 对象finalize()函数被调用,并且没有复活

垃圾回收时的停顿现象: Stop-The-World
停顿的目的是终止所有应用线程的执行, 只有这样S系统才不会有新的垃圾产生,同时系统保证了系统状态在某一个瞬间的一致性,也有益于垃圾回收器更好的标记垃圾对象.

第五章 垃圾收集器和内存分配

待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值