Java Garbage Collection基础之Java 垃圾回收机制技术详

最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾回收算法,并详细解释第一步做什么,第二部做什么?这时候才发现具体一步一步怎么来的,确实不知道。那结果就可想而知,面试官就对我不感兴趣了。那一瞬间,感觉自己不应该过分轻信别人的博客,要相信官方的文档,因为有些写博客的技术人员也许自身对某些技术都不是很了解,只是自己记录下学习和使用的经历,再或者文章可能是从别人那里转发而来。所以,写下这篇文章,记录这次惨痛的教训,也希望自己以后学东西能够追根溯源,知其然,更要知其所以然!

本文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类。

一、JVM架构 1、HotSpot 架构

HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性。例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架构生成高性能的目标机器指令。此外,经过对运行时环境和多线程垃圾回收器不断地设计和优化,现在的HotSpot JVM甚至在大型的系统上都具有较高的伸缩性。JVM 的主要组件包括:ClassLoader、运行时数据区和执行引擎。

Java Garbage Collection基础之Java 垃圾回收机制技术详

2、 HotSpot关键组件

与性能密切相关的JVM的关键组件,有堆、JIT编译器,垃圾收集器,在下图中这些组件用深色标注。

Java Garbage Collection基础之Java 垃圾回收机制技术详

性能优化只需要关注这三个组件即可。堆是存储对象的地方,该区域由用户指定(可以在启动应用程序的时候指定)的垃圾回收器来管理。大多数优化选项都是通过配置堆的大小和选择最合适的垃圾回收器来实现。JIT编译器对性能也能产生比较大的影响,但是对于更新版本的(本文档为JDK1.7)JVM很少需要对其进行优化。

二、应用程序性能的衡量要素

通常数来,当优化一个Java应用的时候,我们通常重点关心的是响应时间或吞吐量两者其中的一个。再此对这两个概念做下介绍,便于加深对优化的理解。

1、响应时间

响应时间指的是应用或者系统对一个请求数据的回应。例如:

      桌面UI对鼠标事件的响应速度

网站返回页面的速度

      数据库查询返回的速度

所以,对于重点关心响应时间的应用,较长时间的应用暂停时不可接受的。我们要做到尽可能的提升响应速度,减少响应时间。

2、吞吐量

吞吐量重点关心特定时间内应用程序处理工作的最大值。例如,吞吐量可以通过以下形式来衡量:

      给定时间内的完成的事物数量

一个小时你完成的批处理程序的个数

      一个小时内完成的数据库查询的次数

这种情况下,应用程序能容忍较高的暂停时间,因此,高吞吐量的应用程序有更长的时间基准,快速响应是不必考虑的。

三、自动垃圾收集器是如何工作的 1、什么是自动垃圾收集机制?

自动垃圾收集机制是查看堆内存、区分在使用的对象和未使用的对象、删除未使用的对象的一个过程。对于使用对象或者引用对象,指的是你的程序持有一个指向那个对象的引用。对于未使用的对象或者是无引用对象,则不被你程序的任何部分持有引用。所以,无引用对象使用的内存是可以被重新回收利用的。

在类C语言的编程语言中,内存的分配和回收都是手动的。而在Java中,内存的回收是由垃圾回收器自动处理的。基本的步骤可以描述如下:

步骤一:标记

第一步是标记,通过这一步骤来区分哪块内存在使用,那哪块内存未使用。

Java Garbage Collection基础之Java 垃圾回收机制技术详

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8668d26b54d043e4fe56c41457388ab1.html