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虚拟机可以自适应切换两种方法,因为如果在很少需要回收的对象时,如果还使用停止-复制未免也太浪费了,如果一直用标记-清扫,那么就会产生很多的碎片,有很多碎片的时候就用停止-复制,因为复制到另一个块中,程序自然会去把对象排列好。
Java垃圾回收器的工作原理的更多相关文章
- Java 详解 JVM 工作原理和流程
Java 详解 JVM 工作原理和流程 作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java ...
- Java垃圾回收器
一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...
- [译]Java垃圾回收器的类型
说明:这篇文章来翻译来自于Javapapers 的Types of Java Garbage Collectors 在这部分的教程中我们将讲到可使用的四种不同类型的Java垃圾回收器.垃圾回收是Jav ...
- java垃圾回收期如何工作(编程思想)
垃圾回收器如何工作: 在以前的程序语言中,在堆上分配对象的代价十分昂贵,因此读者会自然觉得对Java中所有对象(基本类型除外)都在堆上分配的方式也非常高昂.然而,垃圾回收期对提高对象的创建速度,却具有 ...
- Java类加载器的工作原理
Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它. ...
- Java 连接池的工作原理(转)
原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...
- Thinking in java学习笔记之垃圾回收器如何工作
垃圾回收器使得java在堆上分配空间的速度可以和其他语言从堆栈上分配空间的速度媲美.
- (转)Java 详解 JVM 工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚 ...
- (摘录)Java 详解 JVM 工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java ...
随机推荐
- 【CSS/JS】如何实现单行/多行文本溢出的省略(...)--老司机绕过坑道的正确姿势
写前端UI的朋友们也许都遇到过这样的问题:我们需要实现这样一个需求,在一个父级元素中隐藏一个可能过长的文本: 这个文本可能是单行的: 也可能是多行的: 下面我就给大家展示如何简单或优雅地实 ...
- 逆水行舟 —— MyBatis
第一轮总结性笔记 这是一个很漫长的过程,我买了套课程,将在日后记录学习笔记,取名为逆水行舟系列 MyBatis的基础 根据MyBatis的官方介绍: 整个测试项目结构如下:使用Maven架构项目 po ...
- 关于Spring Cloud的核心特性
SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别: 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外 ...
- 机器学习入门05 - 泛化 (Generalization)
原文链接:https://developers.google.com/machine-learning/crash-course/generalization 泛化是指模型很好地拟合以前未见过的新数据 ...
- php 中构造函数和析构函数
构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: <?php //定义一个类 c ...
- 【Hadoop】2、Hadoop高可用集群部署
1.服务器设置 集群规划 Namenode-Hadoop管理节点 10.25.24.92 10.25.24.93 Datanode-Hadoop数据存储节点 10.25.24.89 10.25.24. ...
- 从零開始学Xamarin.Forms(一) 概述
Xamarin 读 "ˈzæmərin",是一个基于开源项目mono的可以使用C#开发的收费的跨平台(iOS.Android.Windows Phone.Mac)解决方式. ...
- logstash收集nginx访问日志
logstash收集nginx访问日志 安装nginx #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org ...
- mysql 开发进阶篇系列 53 权限与安全(账号管理的各种权限操作 上)
一. 概述 在了解前两篇的权限系统介绍后,这篇继续讲账号的管理,这些管理包括账号的创建,权限更改,账号删除等.用户连接数据库的第一步都是从账号创建开始. 1. 创建账号 有两种方法可以用来授权账号: ...
- web.xml配置web中的key points(上)
一.定义 定义时注意:xml元素是区分大小写的. <web-app></web-app> 这些必须小写 二.url-pattern 1)url-pattern 的值必须以/或者 ...