第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
2016-02-05 13:05
597 查看
注意:本文主要参考自《深入理解Java虚拟机(第二版)》
说明:查看本文之前,推荐先知道JVM内存结构,见《第一章 JVM内存结构》
1、内存回收的区域
堆:这是GC的主要区域
方法区:回收两样东西
无用的类
废弃的常量
栈和PC寄存器是线程私有区域,不发生GC
2、怎样判断对象是否存活
垃圾回收:回收掉死亡对象所占的内存。判断对象是否死亡,有两种方式:
引用计数法
原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1;引用失效时,计数器值-1
实际中不用,不用的两个原因
每次为对象赋值时,都要进行计数器值的增减,消耗较大
对于A、B相互引用这种情况处理不了(这一点是不用的主要原因)
可达性分析(跟踪收集)
原理:从根集合(GC Roots)开始向下扫描,根集合中的节点可以到达的节点就是存活节点,根集合中的节点到达不了的节点就是将要被回收的死亡节点,如下图中的A/B/C是存活节点,D/E是死亡节点:
View Code
5、垃圾回收线程
系统的垃圾回收是由垃圾回收线程来检测操作的,该线程是一个后台线程(daemon thread)。
5.1、后台线程与我们使用的前台线程而言,有一个特点:当JVM中的前台线程数量为0时,后台线程自动消亡。可以这样讲,后台线程依托于前台线程而存在。
5.2、垃圾回收线程为什么要设置成为后台线程呢?
我们想一下,当前台一个线程都没有时,垃圾还会有吗?或者说垃圾回收还有必要吗?答案是没有必要,所以此时垃圾回收线程也就失去了存活的意义。
所以可以这样讲,将一个线程是否设置为后台线程,就看这条线程在没有其他线程存在的情况下,是否还有存活的意义。
例如,在我们使用Apache mina2做RPC时,我们在消息的接收端直接开启一个后台线程启动服务来接受消息发送端发来的消息事件请求就可以。试着去想,如果在整个JVM中只有当前的这一个后台线程了,那么这个线程还有必要存活下来吗?当然没有必要,因为消息永远都不会再发送了(前台线程都没了)
说明:查看本文之前,推荐先知道JVM内存结构,见《第一章 JVM内存结构》
1、内存回收的区域
堆:这是GC的主要区域
方法区:回收两样东西
无用的类
废弃的常量
栈和PC寄存器是线程私有区域,不发生GC
2、怎样判断对象是否存活
垃圾回收:回收掉死亡对象所占的内存。判断对象是否死亡,有两种方式:
引用计数法
原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1;引用失效时,计数器值-1
实际中不用,不用的两个原因
每次为对象赋值时,都要进行计数器值的增减,消耗较大
对于A、B相互引用这种情况处理不了(这一点是不用的主要原因)
可达性分析(跟踪收集)
原理:从根集合(GC Roots)开始向下扫描,根集合中的节点可以到达的节点就是存活节点,根集合中的节点到达不了的节点就是将要被回收的死亡节点,如下图中的A/B/C是存活节点,D/E是死亡节点:
View Code
5、垃圾回收线程
系统的垃圾回收是由垃圾回收线程来检测操作的,该线程是一个后台线程(daemon thread)。
5.1、后台线程与我们使用的前台线程而言,有一个特点:当JVM中的前台线程数量为0时,后台线程自动消亡。可以这样讲,后台线程依托于前台线程而存在。
5.2、垃圾回收线程为什么要设置成为后台线程呢?
我们想一下,当前台一个线程都没有时,垃圾还会有吗?或者说垃圾回收还有必要吗?答案是没有必要,所以此时垃圾回收线程也就失去了存活的意义。
所以可以这样讲,将一个线程是否设置为后台线程,就看这条线程在没有其他线程存在的情况下,是否还有存活的意义。
例如,在我们使用Apache mina2做RPC时,我们在消息的接收端直接开启一个后台线程启动服务来接受消息发送端发来的消息事件请求就可以。试着去想,如果在整个JVM中只有当前的这一个后台线程了,那么这个线程还有必要存活下来吗?当然没有必要,因为消息永远都不会再发送了(前台线程都没了)
相关文章推荐
- iOS开发——UILabel自适应较多的文本
- 【树】【独立集】【动态规划】[BZOJ1040][ZJOI2008]骑士
- 单机游戏魔塔学院的安卓版本打包经验小结(二)
- HDU 5274(树链剖分)
- CSS3:backgroud-size和background-origin的使用方法
- 图(最小生成树)MST 1
- Xcode下搭建OpenCV 3.1
- 详解iOS7原生二维码,条码扫描
- ECharts 饼图
- PHP---文件系统
- POJ 2528 线段树区间查找区间询问
- AIM Tech Round (Div. 2)-B. Making a String(贪心)
- 虚拟机下Linux网络设置几种方式的区别
- HDU 1671 Phone List (字典树)
- sql server 基本操作二
- 表的简单实现——使用C++容器库(STL List)
- 利用jquery,访问ashx,调用ironPython模块功能
- 清华EMBA课程系列思考之五 -- 战略人力资源
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- hibernate中SessionFactory,Session的理解?