综述java运行中垃圾回收机制

2017-04-08 18:52张卫
数字技术与应用 2017年2期
关键词:程序

张卫

摘要:java语言作为一中优秀的编程语言,其优秀之因素一个比较重要的方面就是具有自动垃圾回收机制,垃圾回收可以减少程序员的工作量,提升程序的执行效率。本文对垃圾回收机制做了研究说明。

关键词:GC;垃圾回收机制;java;jvm;程序

中图分类号:TP312 文献标识码:A 文章编号:1007-9416(2017)02-0231-01

Java语言由于其良好的跨平台性而得到广泛应用,作为C++的改良语言,java增加了垃圾回收机制,从而避免了C++运行时由于忘记释放对象而带来的内存泄漏问题。Java中,运行需要的对象名称存放在栈中,而该对象实例化后的数据保存在堆中,如果一个栈中的对象不再指向原来堆中的数据时,则这个对象所占用的内存空间就是一个垃圾,Java运行环境中JVM的一个系统线程能及时释放一些无用信息。Java代码执行顺序如图1所示。

从中可知垃圾回收是在一个程序运行块的最后一个环节(实际执行过程中这个过程是循环的,垃圾回收时间是由算法加权得到不可预测)。它是一个动态存储管理技术,自动释放不再被引用的对象,这个释放的过程按照一定的算法来实现。在java中没有c++中的delete命令但是其中系统提供了gc方法回收垃圾。下面对GC机制下的gc方法进行测试:

1 测试代码

测试代码如图2所示。

2 测试环境

测试环境是在安装jdk和jre的电脑上,通过控制台调用javac编译器编译生成类文件,然后调用java命令执行该类文件,在后面配置-verbosegc参数可以查看程序使用堆内存的情况,如图3所示。

3 测试结果

从测试结果截图中可以看到系统共收回848-617=231K的空间,括号里面的125952K表示堆内存总容量,共使用了0.0105963秒。

上面测试中使用了系统gc方法回收垃圾,但是为了减少使用GC而导致的间歇性停顿,尽量不要显式调用系统gc方法。系统GC的触发条件是应用程序空闲时,或者java堆内存不足时,前者是为了不占用系统后期程序运行时间而设置的优化,而后者是强制调用,出现堆内存不足时系统会回收内存用于重新分配,如果内存还是不够的情况下,系统会再进行两次GC调用,如果还是无法满足条件,就会报出内存溢出的错误。

GC在进行垃圾回收时,会首先调用finalize函数,这个函数的作用是释放一些其他做法开辟的内存空间,由于java垃圾回收器默认只知道回收由new方法分配的内存空间,而一些如调用c语言malloc函数分配的空间或者打开的文件资源等,java垃圾回收机制不会主动收回,这时候可以在finalize方法中出一些清理工作,需要對该函数的一个重写工作,在重写的过程中可以对特殊空间进行一些处理。

在垃圾回收机制中,垃圾是要按照一定的算法回收的,通常提供的算法有以下几种:

(1)增量收集法(Incremental Collecting)。增量收集法是在应用运行的时候运行算法进行垃圾回收,但是在JDK5以后不再使用该算法,此处不叙。

(2)引用计数法(Reference Counting)。这是一种比较传统的垃圾回收算法,在某个对象被使用的时候,让引用计数加1,删除某个对象的引用后,就让引用计数减1,如此在一个对象正常引用结束的时候,引用计数为0,在GC回收内存的时候,只用手机引用计数为0的对象。但是这个算法无法解决对象的循环引用。

4 结语

垃圾回收机制给程序员的开发带来了极大的便利,垃圾回收能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先在编程效率方面,垃圾回收机制帮助程序员解决了很多难懂的存储器问题,同时垃圾回收机制提升程序的安全性,保护程序的完整。

猜你喜欢
程序
试论我国未决羁押程序的立法完善
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
创卫暗访程序有待改进