Java垃圾回收器的工作原理
上课,老师照本宣科,实在难以理解,干脆就看书包里的Java书,正好看了Java的垃圾回收器是如何工作的,觉得有必要记录一下。
参考于 Java编程思想第四版(Thinking in Java)
老年代中一般使用标记压缩
新生代中一般使用copy,所以有一个eden和两个survivor。
1.垃圾回收器对于提高对象的创建速度,有明显的效果
问题来了,垃圾回收是释放对象,而关创建对象什么事?
首先了解一下Java是如何在堆上分配内存的,Java使用“堆指针”,每分配一个对象,指针就往后移一位,类似于堆栈,这样就达到了高速创建对象,但这样的方法带来了弊端,在堆栈中还可以出栈来释放,在堆里你没有出栈啊,不一会堆(内存)就满了,就要放磁盘上去,非常浪费时间。那么这时候垃圾回收装置就介入了,他帮助我们回收空间,并处理因为释放对象而产生的碎片(因为有的对象可能比较小,释放后就空了一块内存,比如大小为5,但是其他对象的大小都在10以上,那么这块内存就是碎片了,别的对象根本就放不进去)。
有了垃圾回收器,所以java才能使用“堆指针”来创建对象,所以说垃圾回收器对创建速度有明显的效果
2.Java垃圾回收器的具体机制
2.1 引用计数法
就是每个对象都有一个标志,每次被引用1次就加1,如果引用为0,那么就会去回收,但会有特殊情况,如果两个对象在堆里,互相引用,那么使用这种方法就失效了,所以java中不用这种方法。
2.2停止-复制(stop-and-copy) 和 标记-清扫(mark-and-sweep)
这两个思想是相同的,不同具体实现略有不同。这两种方式需要程序暂停才能工作。
首先从堆栈或静态存储区开始,遍历所有的引用,根据引用找到对象,再遍历查看找到对象中的引用,依次下去,这样就避免的互相引用的问题,因为如果互相引用,那么在堆栈中根本就不会出现
停止-复制就是在开辟一个堆,然后把“活”的引用复制到堆中,不过开辟堆实在太浪费,感觉就在把一个堆划分成不同的块,在块中复制。
标记-清扫就是“活”的对象给个标记,先找出打好标记,然后在回收。
Java虚拟机可以自适应切换两种方法,因为如果在很少需要回收的对象时,如果还使用停止-复制未免也太浪费了,如果一直用标记-清扫,那么就会产生很多的碎片,有很多碎片的时候就用停止-复制,因为复制到另一个块中,程序自然会去把对象排列好。
转载于:https://www.cnblogs.com/dddyyy/p/9895896.html
Java垃圾回收器的工作原理相关推荐
- jvm性能调优 - 18白话G1垃圾回收器的工作原理
文章目录 ParNew + CMS的组合的痛点 G1垃圾回收器 G1是如何做到对垃圾回收导致的系统停顿可控的? Region可能属于新生代也可能属于老年代 总结 ParNew + CMS的组合的痛点 ...
- 029、JVM实战总结:大厂面试题:最新的G1垃圾回收器的工作原理,你能聊聊吗
1.ParNew + CMS的组合让我们有哪些痛点? 痛点:STW,且停顿时间不可控 G1垃圾回收器比~更好的垃圾回收性能 2.G1垃圾回收器 G1 同时回收新生代和老年代的对象,把java堆拆分为多 ...
- 【译】让垃圾回收器高效工作(四)
这篇文章我们来谈谈垃圾回收器和程序的虚拟内存.物理内存之间的关系.再谈谈怎样判断你的托管堆是否是健康的:为什么在机器还有大量内存的情况下程序会抛出OutofMemoryException. 垃圾回收和 ...
- JAVA垃圾回收器的介绍
JAVA垃圾回收器的介绍 垃圾回收器一共有7种: 如下图 其中G1 和 CMS 属于比较新的,暂停时间比之前较少. serial serial Old parNew 这个是serial的多线程版本. ...
- java垃圾回收器有哪些_各种Java垃圾回收器的比较总结
原标题:各种Java垃圾回收器的比较总结 现在已经是2017年了,但是对大多数开发人员而言有两件事情仍然是个谜--垃圾回收以及异性(码农又被嘲笑了).由于我对后者也不是特别了解,我想我还是试着说说前者 ...
- 深入理解Java虚拟机:Java垃圾回收器
本篇内容包括:7 种 Jvm 垃圾回收器的介绍.对比 以及 对应的 Jvm 参数设置,这 7 种包括了:Serial.ParNew 以及 Parallel Scavenge 三种新生代回收器 和 :S ...
- 关于java垃圾回收器(GC)的一些基础知识
关于java垃圾回收器(GC)的一些基础知识 定义: Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 注意:回收的是已经不再被使 ...
- 什么是 Java 垃圾回收器~
什么是 Java 垃圾回收器 Java 垃圾回收器是 Java 虚拟机 (JVM) 的三个重要模块 (另外两个是解释器和多线程机制) 之一,为应用程序提供内存的自动分配 (Memory Allocat ...
- Java 线程池的工作原理
文章目录 概念 线程中的基本方法 线程复用 线程池的核心组件和核心类 线程池的工作原理 线程池中的workQueue任务队列 直接提交队列(SynchronousQueue) 有界任务队列(Array ...
最新文章
- jtree 默认展开树的全部节点
- 【机器视觉】 if算子
- win下python2,3和pip2,3双版本共存
- 连续自然数和(洛谷-P1147)
- Java集合——概述
- hdu 1247 map
- 智能语音识别系统_语音识别技术原理_智能语音识别系统如何识别用户意图_企业服务汇...
- matlab2c使用c++实现matlab函数系列教程-find函数
- 三、Oracle学习笔记:DDL数据定义语句
- JS中的变量和输入输出
- 计算机视觉教程 章毓晋 pdf,计算机视觉教程 教学课件 章毓晋 CCV08.pdf
- Kali渗透-ARP断网攻击与监听
- 虚幻4渲染编程(环境模拟篇)【第一卷:体积云天空模拟(1)---层云】
- 如何使用OLED显示图像
- 2021 春季新品发布会上,苹果推出了全新配件 AirTag
- 短视频查重机制及去重方法
- 文件夹重命名,快速修改多个文件夹名称
- MRS IoTDB时序数据库的总体架构设计与实现
- win7系统安装信息服务器不可用怎么办,RPC服务器不可用?Win7系统RPC服务器不可用怎么办...
- 牛顿迭代法(Newton’s Method)迭代求根的Python程序
热门文章
- 分享基于silverlight的一个大文件上传控件
- Java每天学习一点点 09.10.13
- 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)
- 《Algorithms》Comparable 实现归并排序
- 开发软件快捷键(持续更新中)
- mysql存储过程in_在MySQL存储过程中使用WHERE IN()
- 一文读懂商业智能(BI):企业数据分析的中枢
- (干货分享)农商行中商业智能建设的整体思路与架构
- 华北水利水电大学计算机研究生调剂,2017年华北水利水电大学考研调剂公告
- mysql锁的一些理解简书_MySQL锁的基本概念