JAVA垃圾回收机制概要
垃圾回收是JAVA中的一个大知识点,也是一个著名知识点,毕竟JAVA号称自己先进性的时候总是会带上垃圾回收。于是,它也成了面试中的常客,面试官动不动的就要你解释下什么是垃圾回收,以及它的原理是什么。当然,虽然,以及肯定,那个问你垃圾回收的面试官他99%也只是略知皮毛而已。当面试官问你什么是垃圾回收机制的时候,你应该这样一本正经的反问:请问您问的哪个VM中的垃圾回收机制?
由于垃圾回收中涉及到的概念复杂,算法复杂,你若想弄明白其中的全部细节,必定得不偿失。但是,如果我们掌握了以下的垃圾回收机制的概要,相信在绝大部分的面试中你不会失分。
一:什么是垃圾?
举例来说,一个对象你不用了,它就是垃圾,比如:
public void test01(){
User user = new User();
//...
}
test01方法执行完毕,user对象没有任何用处了,那它就是垃圾了。
二:为什么要进行垃圾回收?
我们知道,对象是存放在堆上的,那么堆有多大?虽然可以通过命令参数进行调整,但是通常情况下,32位系统下,Java堆大小设置在2 GB其中,500 MB 分配给新生代(YoungGen)1.5 GB的分配给老年代(OldGen)空间。即便64位,想想我们PC的硬件内存能有多大。
所以,没用的垃圾,统统回收,让出内存空间,给其它对象用。
三:JDK默认的HotSpot VM垃圾回收的机制
1:堆内存的分类
要理解这个机制,首先得明白堆的分类。是的,我们光知道对象存在于堆上,但是不知道堆内部也分为几个空间,如下图所示:
Young/New Generation 新生代
其内部又分为Eden 与两个Survivor Space 组成。新建的对象都将分配到新生代中,
Old/Tenured Generation 老年代
老年代用于存放程序中经过几次垃圾回收后还存活的对象
(PS:Permanent Generation 非堆内存,用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。)
2:回收次序
每个空间的执行顺序如下:
- 绝大多数刚刚被创建的对象会存放在伊甸园空间。
- 在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。
- 此后,在伊甸园空间执行GC之后,存活的对象会被堆积在同一个幸存者空间。
- 当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。之后会清空已经饱和的那个幸存者空间。
- 在以上的步骤中重复几次依然存活的对象,就会被移动到老年代。
四:垃圾收集器与回收算法
两种类型的代都有自己的收集器,每种收集器采用不同的算法。请记住,对于初级选手,我们并不需要掌握每个算法原理。
新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge
老年代收集器使用的收集器:Serial Old、Parallel Old、CMS
其对应的算法如下,
Serial收集器(复制算法)
新生代单线程收集器,标记和清理都是单线程,优点是简单高效。
Serial Old收集器(标记-整理算法)
老年代单线程收集器,Serial收集器的老年代版本。
ParNew收集器(停止-复制算法)
新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。
Parallel Scavenge收集器(停止-复制算法)
并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。
Parallel Old收集器(停止-复制算法)
Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先
CMS(Concurrent Mark Sweep)收集器(标记-清理算法)
高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择
五:什么时候会运行垃圾回收?
垃圾回收有两种类型,Scavenge GC和Full GC。
当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC。此时会对新生代进行垃圾回收。
当,年老代(Tenured)被写满、持久代(Perm)被写满、System.gc()被显示调用、上一次GC之后Heap的各域分配策略动态变化,执行Full GC。
注意,无论是那种回收,并不意味着会把全部的垃圾回收掉,而是根据算法自己的判断,在一段时间内除掉一定数量的垃圾,这个时间和数量我们不可知。
以上,就是你必须知道的垃圾回收机制。
JAVA垃圾回收机制概要的更多相关文章
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- Java垃圾回收机制的工作原理
Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 获取更多内容,请关注小编个人微信公众平台: 一.Java中引入垃圾回收机制的作用 ...
随机推荐
- React 与 Redux 在生产环境中的实践总结
React 与 Redux 在生产环境中的实践总结 前段时间使用 React 与 Redux 重构了我们360netlab 的 开放数据平台.现将其中一些技术实践经验总结如下: Universal 渲 ...
- 操作数组不要只会for循环
很多时候,我们在操作数组的时候往往就是一个for循环干到底,对数组提供的其它方法视而不见.看完本文,希望你可以换种思路处理数组,然后可以写出更加漂亮.简洁.函数式的代码. reduce 数组里所有值的 ...
- 记在VMware虚拟机中对网站进行性能压力测试的经历
由于本次测试,仅仅是对静态网站首页进行的测试,所以没有涉及到MySQL数据库的性能监测 服务器基本配置 webbench测试工具 Linux上一款优秀的web性能压力测试工具.webbench最多可以 ...
- 记一次重装系统(.net开发环境重装问题汇总)
起因: 有一天,我突然感觉到电脑的运行明显变慢,慢的可怕,启动任务资源管理器一看,不看不知道,一看吓一跳,CPU使用率,物理内存皆100%,当时的第一印象,是电脑中病毒了吧!!,进入进程一看,有几个名 ...
- 【二分答案+2-SAT】Now or later UVALive - 3211
题目链接:https://cn.vjudge.net/contest/209473#problem/J 题目大意: 有n架飞机,每架飞机有两个可降落时间点a,b(a<b)(即一架飞机可以选择在时 ...
- 数据库事务的属性-ACID和隔离级别
1.数据库事务的属性-ACID(四个英文单词的首写字母): 1)原子性(Atomicity) 所谓原子性就是将一组操作作为一个操作单元,是原子操作,即要么全部执行,要么全部不执行. 2)一致性(Con ...
- hdu 5726 GCD 暴力倍增rmq
GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...
- 自动添加 Qt 开发生成的 exe 所需的依赖环境
双击获取 exe 文件路径 cd 进入文件目录的命令 调用 Qt 自带的软件进行环境配置,命令如下 windeployqt ***.exe 自动配置了依赖环境
- Mac下配置Apache服务器
有的时候,我们需要在内网工作组中分享一些文件或是后台接口没有及时给出,你又想要模拟真实数据,直接在项目里创建plist也可以做到这种需求,但难免让工程变得冗余且看起来比较Low.这个时候就看出配置本地 ...
- java判断集合是否重复的一种便捷方法
内容来自其它网站,感谢原作者! import java.util.ArrayList; import java.util.HashSet; import java.util.List; /** * 通 ...