Java垃圾收集器概述
垃圾收集器的操作
查找未使用的对象,释放内存,并压缩堆,避免内存碎片
一个java程序,有执行应用程序逻辑的线程和执行GC的线程组。当GC跟踪对象引用,或在内存中移动对象,它必须确保应用程序线程没有使用这些对象。 尤其如此在GC移动对象:在该操作期间对象的内存位置发生变化,因此没有应用程序线程可以访问该对象。所有应用程序线程停止时的暂停叫做 stop-the-world 暂停.
Generational Garbage Collectors(分代垃圾收集器)
- 尽管细节有所不同,但所有垃圾收集器都通过拆分堆为不同的代来工作。这些被称为老年代,和年轻代。年轻代进一步分为eden、survivor。划分年轻代的基本原理是:许多对象被使用非常短的时间。
minor GC
- 当年轻代内存满时,垃圾收集器将停止所有应用程序线程并清空
年轻代。 丢弃不再使用的对象,仍在使用的对象被转移到survivor之一或者老年代。
优点:
- 因为年轻代只是整个堆的一部分,处理它比处理整个堆更快
- 由于移动了所有幸存对象到survivor之一或者老年代,因此年轻代自动的在收集时压缩。
所有GC算法在收集年轻代时都会 stop-the-world pauses
full GC
随着对象被移动到老年代,最终它也将填满,JVM将需要在老年代中找到不再使用的任何对象并丢弃它们。这是GC算法最大的区别。 这最简单算法是停止所有应用程序线程,找到未使用的对象并释放内存,然后压缩堆。此过程称为 full GC,它通常会导致应用程序线程的长暂停。
另一方面,有可能 - 虽然计算复杂 - 找到不使用的对象在应用程序线程运行时; CMS和G1都采用这种方法。因为扫描未使用对象的阶段可以在不停止应用程序线程的情况下发生,CMS和G1称为并发收集器。 他们也是称为低暂停(有时是不正确的,无法暂停)的收集器,因为它们最小化需要停止所有应用程序线程。 并发收集器也有不同压缩老年代的方法。
使用CMS或G1收集器时,应用程序通常会更少(和更短暂)停顿。 权衡是应用程序将使用更多的CPU
在任何情况下都需要权衡利弊。在测量单独响应时间的应用程序(如Java EE服务器)中,请考虑以下几点:
- 个别请求将受到暂停时间的影响 - 更重要的是对于 full GC,需要很长的暂停时间。 如果最小化暂停对响应的影响时间是目标,并发收集器将更合适。
- 如果平均响应时间比异常值更重要(即90%响应时间),吞吐量收集器通常会产生更好的结果。
- 使用并发收集器避免长时间停顿的好处来自于额外的CPU使用费用。
类似地,批处理应用程序中垃圾收集器的选择由以下指导权衡:
- 如果有足够的CPU可用,则使用并发收集器以避免full GC暂停将使工作更快完成。
- 如果CPU受限,则并发收集器的额外CPU消耗将会增加
导致批处理作业需要更多时间。
Java垃圾收集器概述的更多相关文章
- Java垃圾收集器——Serial,Parallel,CMS,G1收集器概述
1.概述 Java应用启动的时候,除了配置Xms以及Xmx参数(Xmx:InitialHeapSize, Xms:MaxHeapSize),还需要选择合适的垃圾收集器. 截止Jdk1.8,共提供了7款 ...
- 面试官,不要再问我“Java 垃圾收集器”了
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在面试过程中这个深度的问题涉及的比较 ...
- 面试官,不要再问我“Java 垃圾收集器”了(转载)
如果Java虚拟机中标记清除算法.标记整理算法.复制算法.分代算法这些属于GC收集算法中的方法论,那么"GC收集器"则是这些方法论的具体实现. 在 面试过程中这个深度的问题涉及的比 ...
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- Java垃圾收集器
概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用 ...
- 深入理解JVM : Java垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差 ...
- 重读《深入理解Java虚拟机》二、Java如何分配和回收内存?Java垃圾收集器如何工作?
线程私有的内存区域随用户线程的结束而回收,内存分配编译期已确定,内存分配和回收具有确定性.共享线程随虚拟机的启动.结束而建立和销毁,在运行期进行动态分配.垃圾收集器主要对共享内存区域(堆和方法区)进行 ...
- 理解JVM之垃圾收集器概述
前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收 ...
- 【Java】JVM(三)、Java垃圾收集器
一.Minor GC.Major GC 和 Full GC Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC Major GC:清理老年代空间 Full GC:清理Ja ...
随机推荐
- excel使用poi操作。
String real_path = request.getSession().getServletContext().getRealPath("/");//获取文件路径,我是通过 ...
- ionic3 导航的应用(页面跳转与参数传递)
about.html(跳转页面) <ion-content padding> <ion-list> <ion-item *ngFor="let he of co ...
- Docker 创建 Confluence6.12.2 中文版
目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...
- CAP理论和Base理论
CAP理论 Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容错性) 可靠性, ...
- net view 提示6118错误 解决方法。
1.win+R ,输入services.msc 开启服务:Server ,WorkStation,computer Browser 2.如果你的电脑没有computer Browser服务,win+R ...
- AjaxPro2完整入门教程
一.目录 简单类型数据传送(介绍缓存,访问Session等) 表类型数据传送 数组类型数据传送(包含自定义类型数据) 二.环境搭建 1.这里本人用的是VS2012. 2.新建一个空的Web项目(.NE ...
- iOS 防止UIButton重复点击
使用UIButton的enabled或userInteractionEnabled 使用UIButton的enabled属性, 在点击后, 禁止UIButton的交互, 直到完成指定任务之后再将其en ...
- GCD多线程的一个全面的题目
GCD多线程的一个全面的题目
- Linux Mysql数据库安全配置
Linux Mysql数据库安全配置 目录: 1.修改mysql管理员账号root的密码(2种方法) 2.修改mysql管理员账号root 3.mysql管理员root账号密码遗忘解决办法(2种方法 ...
- linux上修改mysql登陆密码
1. 修改MySQL的登录设置: # vi /etc/my.cnf 2. 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] port ...