如何区分垃圾

上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。

因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器…)。而最简单的Java栈就是Java程序执行的main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式

如何处理碎片

由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。

如何解决同时存在的对象创建和对象回收问题

垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解决二者矛盾的方式。

但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处理能力也会相应降低,同时,“碎片”问题将会比较难解决。

转载于:https://www.cnblogs.com/jxhd1/p/6547607.html

JVM调优总结(3):垃圾回收面临的问题相关推荐

  1. JVM调优面试题——垃圾回收专题

    文章目录 1.如何确定一个对象是垃圾? 1.1.引用计数法 1.2.可达性分析 2.对象被判定为不可达对象之后就"死"了吗? 3.都有哪些垃圾收集算法? 3.1. 标记-清除(Ma ...

  2. JVM调优:基本垃圾回收算法

    查看全文 http://www.taodudu.cc/news/show-126595.html 相关文章: GitHub 上有哪些适合新手跟进的优质项目?(附地址) 用 Pytorch 理解卷积网络 ...

  3. JVM调优:常见垃圾回收算法

  4. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

  5. 一文详解java中对JVM的深度解析、调优工具、垃圾回收

    2019独角兽企业重金招聘Python工程师标准>>> jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以 ...

  6. JVM调优:G1垃圾回收器

  7. JVM调优:常见垃圾回收器及常见组合

  8. JVM调优:常见垃圾回收器组合

  9. JVM调优:定位垃圾的常用算法

  10. jvm调优:何为垃圾及与c++的对比

最新文章

  1. Tensorflow中的mnist例子
  2. IronRuby - 如何在VS2010下调试IronRuby代码
  3. php链接数据库实行增删查改_利用PHP连接数据库——实现用户数据的增删改查的整体操作实例...
  4. 字符转char android,android – 如何在kotlin语言中将char转换为ascii值
  5. python爬取抖音用户数据_python批量爬取下载抖音视频
  6. Vue学习之路1 小白起步
  7. 恒驰机器人_恒大汽车基地:2545台机器人为恒驰“效力”
  8. Java微信公众号开发-外网映射工具配置 - 星星满天 - 博客园
  9. codevs 1164 统计数字
  10. 【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
  11. 【语音隐写】基于matlab GUI DWT+SVD音频水印嵌入【含Matlab源码 1409期】
  12. 信道估计算法matlab代码汇总
  13. VBA-保存指定工作表为工作簿文件
  14. cesium-加载天地图影像
  15. css 毛玻璃: backdrop-filter
  16. Golang-Flag包文档翻译
  17. 链表的头插法和尾插法——头插尾插交替插入
  18. codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】
  19. 解决linux系统网络时常断开的问题
  20. NAT之server nat

热门文章

  1. 操作系统--文件管理之索引
  2. 计组—中央处理器(CPU)
  3. 什么叫临界资源和临界区?
  4. 卡尔曼滤波器(Kalman Filter) 理解
  5. 同域下iframe操作时,js访问document出现拒绝访问的问题原因
  6. Windows7环境下用VirtualBox (5.1)上安装Ubuntu 17.10
  7. 如何在anaconda环境下安装tensorflow/pytorch/keras等
  8. 如何用dds实现线性调频_用神经网络生成线性调频
  9. 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I
  10. 动态时间规整-DTW算法