么当然当然是肯定的那究竟什么时候我们还需要用到的呢
我们知道GC主要处理的是对象的回收操作那么什么时候会触发一个对象的回收的呢
其实我们最容易想到的就是当对象没有引用的时候会将这个对象标记为可回收对象那么现在就有一个问题是不是这个对象被赋值为空以后就一定被标记为可回收对象了呢
并不是这个对象被赋值为空之后就一定被标记为可回收有可能会发生逃逸
即当这个类被加载到内存以后就会产生方法区堆栈程序计数器等一系列信息当创建对象的时候为这个对象在堆栈空间中分配对象同时会产生一个引用计数器同时引用计数器1当有新的引用的时候引用计数器继续1而当其中一个引用销毁的时候引用计数器-1当引用计数器被减为零的时候标志着这个对象已经没有引用了可以回收了这种算法在JDK1.2之前的版本被广泛使用但是随着业务的发展很快出现了一个问题
这样的代码会产生如下引用情形objA指向objB而objB又指向objA这样当其他所有的引用都消失了之后objA和objB还有一个相互的引用也就是说两个对象的引用计数器各为1而实际上这两个对象都已经没有额外的引用已经是垃圾了。
根搜索算法是从离散数学中的图论引入的程序把所有的引用关系看作一张图从一个节点GC ROOT开始寻找对应的引用节点找到这个节点以后继续寻找这个节点的引用节点当所有的引用节点寻找完毕之后剩余的节点则被认为是没有被引用到的节点即无用的节点。
而这样obj对象对后面newObject的一个强引用只有当obj这个引用被释放之后对象才会被释放掉这也是我们经常所用到的编码形式。
非必须引用内存溢出之前进行回收可以通过以下代码实现
软引用主要用户实现类似缓存的功能在内存足够的情况下直接通过软引用取值无需从繁忙的真实来源查询数据提升速度当内存不足时自动删除这部分缓存数据从真正的来源查询这些数据。
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收短时间内通过弱引用取对应的数据可以取到当执行过第二次垃圾回收时将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器
垃圾回收时回收无法通过引用取到对象值可以通过如下代码实现
虚引用是每次垃圾回收的时候都会被回收通过虚引用的get方法永远获取到的数据为null因此也被成为幽灵引用。
但是方法区的回收条件非常苛刻只有同时满足以下三个条件才会被回收
好了我们现在切入正题Java1.2之前主要通过引用计数器来标记是否需要垃圾回收而1.2之后都使用根搜索算法来收集垃圾而收集后的垃圾是通过什么算法来回收的呢
复制算法采用从根集合扫描并将存活对象复制到一块新的没有使用过的空间中这种算法当控件存活的对象比较少时极为高效但是带来的成本是需要一块内存交换空间用于进行对象的移动。也就是我们前面提到的
标记-清除算法采用从根集合进行扫描对存活的对象对象标记标记完毕后再扫描整个空间中未被标记的对象进行回收如上图所示。
标记-清除算法不需要进行对象的移动并且仅对不存活的对象进行处理在存活对象比较多的情况下极为高效但由于标记-清除算法直接回收不存活的对象因此会造成内存碎片
复制算法采用从根集合扫描并将存活对象复制到一块新的没有使用过的空间中这种算法当控件存活的对象比较少时极为高效但是带来的成本是需要一块内存交换空间用于进行对象的移动。也就是我们前面提到的
-整理算法采用标记-清除算法一样的方式进行对象的标记但在清除时不同在回收不存活的对象占用的空间后会将所有的存活对象往左端空闲空间移动并更新对应的指针。标记-整理算法是在标记-清除算法的基础上又进行了对象的移动因此成本更高但是却解决了内存碎片的问题。
看名字我们都可以看的出来这个属于串行收集器。其运行示意图如下
收集器是历史最悠久的一个回收器JDK1.3之前广泛使用这个收集器目前也是ClientVM下ServerVM 4核4GB以下机器的默认垃圾回收器。串行收集器并不是只能使用一个CPU进行收集而是当JVM需要进行垃圾回收的时候需要中断所有的用户线c;知道它回收结束为止因此又号称“Stop The World”的垃圾回收器。注意JVM中文名称为java虚拟机因此它就像一台虚拟的电脑一样在工作而其中的每一个线程就被认为是JVM的一个处理器因此大家看到图中的CPU0、CPU1实际为用户的线c;而不是真正机器的CPU大家不要误解哦。
串行回收方式适合低端机器是Client模式下的默认收集器对CPU和内存的消耗不高适合用户交互比较少后台任务较多的系统。
ParNew收集器其实就是多线程版本的Serial收集器其运行示意图如下
所提到的吞吐量程序运行时间/(JVM执行回收的时间程序运行时间),假设程序运行了100分钟JVM的垃圾回收占用1分钟那么吞吐量就是99%。在当今网络告诉发达的今天良好的响应速度是提升用户体验的一个重要指标多核并行云计算的发展要求程序尽可能的使用CPU和内存资源尽快的计算出最终结果因此在交互不多的云端比较适合使用该回收器。
ParallelOld是老生代并行收集器的一种使用标记整理算法、是老生代吞吐量优先的一个收集器。这个收集器是JDK1.6之后刚引入的一款收集器我们看之前那个图之间的关联关系可以看到早期没有ParallelOld之前吞吐量优先的收集器老生代只能使用串行回收收集器大大的拖累了吞吐量优先的性能自从JDK1.6之后才能真正做到较高效率的吞吐量优先。其运行示意图如下
SerialOld是旧生代Client模式下的默认收集器单线之前也是ParallelScvenge回收新生代模式下旧生代的默认收集器同时也是并发收集器CMS回收失败后的备用收集器。其运行示意图如下
并发执行而在这个过程中随着内存引用关系的变化可能会发生原来标记的对象被释放进而引发新的垃圾因此可能会产生一系列的浮动垃圾不能被回收。
CMS会产生浮动垃圾当回收过后浮动垃圾如果产生过多同时因为使用标记-
sun公司预期SunHotSpot1.7发布正式版他是商用高性能垃圾回收器通过重新划分内存区域整合优化CMS同时注重吞吐量和响应时间但是杯具的是被oracle收购之后这个收集器属于商用收费收集器因此目前基本上没有人使用我们在这里也就不多介绍更多信息可以参考oracle新版本JDK说明。下面我们再来看下JVM的一些内存分配与回收策略1、 优先在Edon上分配对象
而这些垃圾回收器又分为串行回收方式、并行回收方式合并发回收方式执行分别运用于不同的场景。如下图所示
就是担保minorGC能够满足当前的存储空间而无需触发老生代的回收由于大部分对象都是朝生夕死的因此在实际开发中这种很起效但是也有可能会发生担保失败的情况当担保失败的时候会触发FullGC但是失败毕竟是少数因此这种一般是很划算的
两个概念: 新生代:存放生命周期较短的对象的区域。 老年代:存放生命周期较长的对象的区域。 相同点: 都在Java堆上 1.标记清除
。 图解: 缺点: 效率问题;遍历了两次内存空间(第一次标记,第二次清除)。 空间问题:容易产生大量内存碎片,当再需要一块比较大的内存...
收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。
中,程序计数器、虚拟机栈、本地方法栈都是都是线程私有的,随线程而生随线程而灭,栈帧(栈中的对象)随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存
1.1.那究竟GC为我们做了什么操作呢? 首先要弄清楚以下几个问题: 1,哪些内存需要
? 这时候有人就会疑惑了,既然GC已经为我们解决了这个矛盾,我们还需要学习GC么?当然当然是肯定的,那究竟什么时候我们还需要用到的呢? 1,排查内存溢出 2,排查内存...
机制一直是 Java 业内从业者绕不开的话题(实际调优、面试),Jack 和大家再来一起学习一下
机制。作为 Java 从业者如果不掌握这些知识点可能很难跳过高级走向架构师阶段。 本场 Chat,作者将会围绕
的参数设置和如何监控这四个话题展开。通过本场 Chat 相信大家会学会如下内容: 1.
的面试和实际工作。 通过本场 Chat 希望能和大家一起提升和学习。 实录内容提要: 1. 递归和 for 循环分别影响的是哪块内存? 1.
? 1. 对象四种引用方式是什么,在什么场景用到? 1. -D -XX -X 有什么区别? 1. 问题默认开启的是哪个 GC ? 1. 我们一般需要关注的参数有哪些? 1. 实际生产环境你们设置了哪些参数? 1. 监控的工具有哪些? 1. Java 8 引入了元空间,元空间和永久代有什么不一样?元空间和永久代可以理解为方法区的不同实现吗? 1. 国外有哪些一手
的监控集成到系统里面? *当前内容版权归码字科技所有并授权显示,盗版必究。[阅读原文](
上一篇博客介绍了Java运行时内存的各个区域。对于程序计数器、虚拟机栈、本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭。并且这三个区域的内存分配与
关注的是Java堆与方法区这两个区域。 1、如何判断对象已“死” Java堆中存放着几乎所有的对象实例,
虚拟机运行时的内存模型: 1.方法区 Perm(永久代、非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:
上文回顾:《可能是把Java内存区域讲的最清楚的一篇文章》 写在前面 本节常见面试题: 问题答案在文中
提到 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类
intellij idea 13&14 插件推荐及快速上手建议 (已更新!)
Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码
jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器wusanSir:
- 本文固定链接: http://fenleilaji.cc/?id=25971
- 转载请注明: admin 于 分类垃圾-环境保护从分类垃圾做起! 发表
《本文》有 0 条评论