浅析java垃圾回收机制
什么是java程序中的垃圾?什么这些垃圾又是怎样被回收的?为什么会被回收?不进行回收又会怎样?这些问题都是我们要在这篇博客中要解决的问题!
大家都知道,在c语言中,作为程序员,必须得考虑到去怎样回收已经分配的内存,经常要面临的问题是,什么时候进行垃圾的回收,什么时候进行释放?释放过早了,那些仍然需要用到的对象资源消失了,面临的是系统的奔溃;但是一旦忘记回收无用的内存,就会导致内存的泄露,降低系统的性能。问题很大吧?很让人觉得恼火吧?但是在java编程时,不需要程序员进行一个显式的内存回收,因为jre已经帮我们做好了这些事情,从起初的内存的分配到那些没有被引用对象的回收,它都一首操控了,简直让人觉得很爽啊。jre会分配个自己的小的隶属——一个小的线程进行检测和控制,这个小的线程,一直在程序运行时,跟踪所有的对象的运行状况,特别是那些已经进行内存的分配,但是没有被引用的对象们,它会很灵活机智地把其在堆内存中所指向的数据区置为null,在cpu空闲或者内存不足时,进行一个垃圾的回收。内存占领它回收的空间,更为人性化的是,由于创建对象和垃圾回收器释放丢弃资源的的内存空间时,会出现碎片。这些碎片就是那些,没有被分配的空间,“比上不足,比下有余”的尴尬处境,jvm会将碎片进行收集和整理,将所占用的堆内存从堆的一端,移动到另外一端,jvm整理出的内存分配给新的对象。
简单介绍了,垃圾回收的机制,那么它有什么特点呢?回收没有用的对象的空间,这些空间都是虚拟机堆内存中的内存空间,它只能回收内存资源,对于外设,数据库资源,IO资源,它并不能发挥自己的作用;垃圾回收还是要具体情况,具体说明下的,在不同的虚拟机下,他们所采用的垃圾回收算法也不一定一样的,所以处理回收方式就可能从在一定的差异,有的可能是定时进行回收,有的也可能在cpu空闲时犯什么,甚至也有可能在cpu运行出现极限时,才进行垃圾的回收。
除此,我们在编写java程序时,对于不在需要的对象,不要去引用它们,如果你要保持对这些对象的引用,垃圾回收机制暂时不会回收这些对象,他们会觉得你可能在下个时刻会使用,所以会为你暂时保留,那这样的话,系统的可用的内存会越来越少,这样,垃圾回收机制会被调用的频率变高,系统的性能会降低。
在实际上,目前有几种常见的垃圾回收的算法。
第一种,引用计数法,引用计数法是唯一没有使用根集的垃圾回收的法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。
第二种,标记和清除垃圾收集器,引出根基的概念,从根集开始扫描,识别出那些对象可达和哪些对象不可达,对于不可达的对象,就进行垃圾的收集。
第三种,compacting算法
为了解决堆碎片问题,在清除的过程中,算法将所有的对象移到堆的一端,堆的另一端就变成了一个相邻的空闲内存区,收集器会对它移动的所有对象的所有引用进行更新,使得这些引用在新的位置能识别原来的对象。在基于Compacting算法的收集器的实现中,一般增加句柄和句柄表。
这里仅仅简单的介绍了三种具体的回收算法,回收算法也随着计算机的发展而不断进行改进和提高。
在具体的编程中,我们也可以向jvm提出强求,即调用方法system.gc().请求垃圾回收,但正如我所说的,仅仅是个请求,jvm在接受到消息时,还会根据垃圾回收算法进行一个加权,使得垃圾回收算法,容易发生,或者容易发生,并不代表,调用后,会直接进行垃圾的回收。对于其中的finalize()方法,该方法,是在真正去回收空间时要执行的的方法,该方法先进行“擦除”,再真正释放空间。
浅析java垃圾回收机制的更多相关文章
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- Java垃圾回收机制的工作原理
Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 获取更多内容,请关注小编个人微信公众平台: 一.Java中引入垃圾回收机制的作用 ...
- Java 垃圾回收机制(早期版本)
Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但 ...
随机推荐
- Python之流程控制——if...else...
Python之流程控制--if...else... 一.流程控制 假如把程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分岔口.当遇到分岔口时,你得判断哪条岔路是你要走的路,如果我们想让程 ...
- PythonWeb框架Django:虚拟环境安装(virtualenv)
虚拟环境的用处: 当我们有多个项目要使用不同的第三方类库的时候,就会发生冲突,因为Python的环境内只允许一个版本的第三方类库. 比如说 有A,B两个Web项目,但是A项目的Django的环境为2. ...
- Drop Table对MySQL的性能影响分析
[问题描述] 最近碰到有台MySQL实例出现了MySQL服务短暂hang死,表现为瞬间的并发线程上升,连接数暴增. 排查Error Log文件中有page_cleaner超时的信息,引起我们的关注: ...
- Linux搭建nginx负载均衡(两台服务器之间)
负载均衡种类 第一种:通过硬件负载解决,常见的有NetScaler.F5.Radware和Array等商用的负载均衡器,价格比较昂贵 第二种:通过软件负载解决,常见的软件有LVS.Nginx.apac ...
- HDU- 3605 - Escape 最大流 + 二进制压位
HDU - 3605 : acm.hdu.edu.cn/showproblem.php?pid=3605 题目: 有1e5的的人,小于10个的星球,每个星球都有容量,每个人也有适合的星球和不适合的星球 ...
- CodeForces 779D. String Game(二分答案)
题目链接:http://codeforces.com/problemset/problem/779/D 题意:有两个字符串一个初始串一个目标串,有t次机会删除初始串的字符问最多操作几次后刚好凑不成目标 ...
- 线段树模板 hdu 1166 敌兵布阵
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 编码神器Lombok,学会后开发效率至少提高一倍!
Lombok会利用注解自动生成javaBean中的getter.setter.equals.toString等一系列方法,大大提供开发效率,本文详细介绍下Lombok的安装及使用. 本文目录 一.Lo ...
- webpack4.0 babel配置遇到的问题
babel配置 babel版本升级到8.x之后发现出现了很多问题.首先需要安装 "@babel/core": "^7.1.2", "@babel/pl ...
- Java日志框架总结
1. 前言 从写代码开始,就陆陆续续接触到了许多日志框架,较常用的属于LOG4J,LogBack等.每次自己写项目时,就copy前人的代码或网上的demo.配置log4j.properties或者lo ...