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 ...
随机推荐
- java StringBuilder 和 StringBuffer
1, 相对于 String 来说, StringBuilder 和 StringBuffer 均是可变的 2, StringBuilder 线程不安全, StringBuffer 线程安全 3, 运行 ...
- windows蓝屏代码
原始链接 引用自 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/bug-check-code-referenc ...
- nodejs+express+mongodb写api接口的简单尝试
1:启动mongodb服务 我的mongoDB的安装目录:E:\mongoDB\bin,版本:3.4.9 打开cmd -> e:(进入e盘) -> cd mongoDB/bin(进入mo ...
- <jsp:useBean>、<jsp:setProperty>与<jsp:getProperty>
<jsp:useBean>标签 会调用java对象的无参构造方法,来创建实例. <jsp:useBean>标签是用来搭配JavaBean元件的标准标签,这里指的JavaBean ...
- Python之--paramiko实例
一.基于SFTPClient类连接sshd服务器: 特点: 一般用于实现对远程服务器的上传, 下载和对远程目录文件的操作 import pramiko hostname = '172.24.0.110 ...
- FFmpeg AVPacket相关主要函数介绍
1.AVPacket相关函数介绍 操作AVPacket的函数大约有30个,主要分为:AVPacket的创建初始化,AVPacket中的data数据管理(clone,free,copy),AVPacke ...
- Python简介之探观止矣
Python是一门什么样的编程语言编程语言主要分为编译型和解释型,静态语言和动态语言,强类型和弱类型,混合语言等.编译型语言:通过编译器把源代码编译(compile)成机器语言,在经过链接(linke ...
- Eclipse启动报错,解决办法
打开log日志,发现如下错误.原因是修改了计算机用户名导致 !SESSION Thu Aug 30 08:55:41 CST 2018 -------------------------------- ...
- elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)
一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...
- 【Python 09】汇率兑换2.0-2(分支语句)
分支语句:根据判断条件选择程序执行路径 1.使用方法 if <条件1>: <语句块1> elif <条件2>: <语句块2> ... else: < ...