浅析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虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但 ...
随机推荐
- awrcrt更新到2.1(重大更新)
awrcrt更新到了2.1 awrcrt迎来了最近一年的最大一次更新,从2.03直接跳跃了2.1版本.本次更新,给awrcrt带了全面的改变. 最主要的更新内容是什么呢?请看 更新了图表javascr ...
- 怎样使用U盘安装Windows系统
准备工作 一个8G及以上的U盘: 软碟通UltraISO,下载地址,非免费,但试用就够了: 系统镜像,推荐去MSDN下载: 安装过程 利用U盘制作启动盘,准备好上述的东西,然后开始制作启动盘: 注意: ...
- 转载-Spring Boot应用监控实战
概述 之前讲过Docker容器的可视化监控,即监控容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.同样利用SpringBoot作为微服务单元的实例化技术选型时,我们不 ...
- WebApi使用OAuth2认证
本篇文章实现了四种认证方式中的客户端模式和密码模式,未实现token持久化 未介绍OAuth2的相关概念,全部是干货,可自己在网上搜索OAuth2相关知识,在这不做过多阐述 一.引用OAuth2所需的 ...
- pickle 序列化对象
# 序列化对象 import pickle mylist=[[1,2,3,4,5,6,7],["abc","xyz","hello"],[1 ...
- SPOJ - GSS1-Can you answer these queries I 线段树维护区间连续和最大值
SPOJ - GSS1:https://vjudge.net/problem/SPOJ-GSS1 参考:http://www.cnblogs.com/shanyr/p/5710152.html?utm ...
- Toad客户端连接Oracle数据库报错 ORA-12170:TNS:连接超时
Oracle 客户端连接Oracle数据库报错 ORA-12170:TNS:连接超时 排错步骤: 1. 查看网络是否畅通: 打开cmd,ping数据库IP 2. 查看端口是否畅通: 打开cmd ...
- WoSign新证书系统通过德国Cure53安全测试
近日,沃通WoSign新证书系统顺利通过德国Cure53白盒子安全测试,并公开发布审计报告总结版. 据悉,根据去年10月份Mozilla提出的整改要求,沃通WoSign投入研发力量高标准严要求地重新开 ...
- 大数据Hadoop基础入门到精通
1.hadoop前世今生: 1) 搜索引擎:网络爬虫+索引服务器(生成索引+检索) 2) Doung Cutting 3) Nutch a.分布式存储 b.分布式计算 4)GFS论文 doung c ...
- 把windows下的压缩包放到Linux目录下去
今天在自学redis时出现了问题,因为楼主linux也是空白纸,前几天安装了Linux后就只会基本的命令,其他的一概不通啊,所以当redis要在Linux中用时就傻眼了,索性就在windows中下载了 ...