java垃圾回收(GC)

来源:互联网 发布:招商证券理财软件下载 编辑:程序博客网 时间:2024/05/16 13:10

面试被问到GC,又发现了自己的薄弱点,亡羊补牢,把这块缺失的知识补上!

先来几个基本概念:

JVM

Java Virtual Machine,执行java字节码的虚拟机。Java可在任意平台运行,不需在不同平台下重新编译,归功于JVMJVM由堆、栈、本地方法栈、方法区等部分组成。

1)

所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为EdenSurvivor区,最后SurvivorFromSpaceToSpace组成

新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制EdenSurvivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象

2)

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果

3)本地方法栈

用于支持native方法的执行,存储了每个native方法调用的状态

4)方法区

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize-XX:MaxPermSize来指定最小值和最大值。

 

JDK:

Java Development Kit,为开发、编译和执行Java应用程序,针对Java的全功能的软件开发包,包含JRE、编译器和工具(如Javadoc Java Debugger)。

JRE

Java Runtime EnvironmentJava 运行环境,包括执行applet的浏览器插件。

 

GC

Garbage Collection,自动检测对象是否超过作用域,从而达到自动回收内存的目的,Java没有提供释放已分配内存的显示操作方法,资源回收工作全部由GC完成,优点:无需手动操作,缺点:程序员不能精确控制垃圾回收的时机。

GC原理:

Java内存管理就是对象管理,包括对象分配和释放。分配用new关键字,释放只是将对象赋值为null,让程序员不能够再访问到(不可达),GC回收所有不可达对象的内存空间。

  对于GC来说,当程序员创建对象时,GC就开始监控这个对象地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象是可达的,哪些对象是不可达的。当GC确定一些对象为不可达时”GC就有责任回收这些内存空间,但为了GC能够在不同的平台上实现,java规范对GC的很多行为都没有进行严格的规定。例如对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定,因此不同的JVM实现着不同的的实现算法,这也给JAVA程序员的开发带来了很多不确定性。 

     根据GC的工作原理,可以通过一些技巧和方式让GC运行更快,高效而又合理。编程建议如下: 

1、尽早释放无用对象的引用,特别注意一些复杂对象,如数组,队列等。对于此类对象,GC回收它们的效率一般较低,如果程序允许,应尽早将不用的引用对象赋为null,这样可以加速GC的工作。 

2、尽量少用finalize函数。finalizejava提供给程序员用来释放对象或资源的函数,但是它会加大GC的工作量,因此尽量少采用finalize函数回收资源。 

      当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是java语言规范并不保证GC一定会执行。 

finalize 

finalize是方法名,java技术允许使用finalize()方法在垃圾收集器从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象的调用的。它是在Object类定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象的调用的

 

 

 

0 0
原创粉丝点击