java——GC回收机制

Posted 东木刀纹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java——GC回收机制相关的知识,希望对你有一定的参考价值。

1. GC是什么?

GC(Gabage Collection):java的垃圾回收机制的根本目的就是跟踪正在使用的对象,然后回收那些不再使用(引用)的对象。java的GC回收机制有两个好处:

(1) 避免垃圾过多导致的内存耗尽

(2) 避免不恰当的内存释放导致的内存非法引用

GC主要是对JVM中的堆对象进行识别,如果对象正在被引用,就是活对象。否则就是死的,是可以被回收再分配的。

 

2. java的内存是如何存储的哪?

堆:用来存储java中创建的对象,new新建的对象都存在java的堆中

栈:用来存储java中对象的引用,常见的变量,static变量,final变量等等,除了对象外基本都在这里存储

 

3. GC触发的条件是什么?是否可以人为操控?

JVM中GC也分为两种,一种是主GC,一种是次GC,主GC的线程优先级最低,因此很少被触发。而次GC的线程触发的频率就比较高了。

主GC触发的两种条件

(1) 主GC的线程优先级非常低,因此只有在程序空闲的时候才会被调用,当然第2个条件除外

(2) 当java堆内存已经不足时,GC会被调用。而且如果GC一次后仍不能满足内存分配,JVM会再进行两次GC作进一步尝试,如果还是无法新建对象,JVM会报out of memory错误,java程序会推出。

然而由于GC是java自己的垃圾回收机制,因此认为编写代码是不能够处理的,不过可以认为调用system.gc(),提醒调用,不过依然无法影响对象的回收顺序以及回收时间。另外,java中的主GC是JVM根据环境来决定的,因此合适运行GC,是无法确定的。但一定是反复进行的

 

4. 如何减少GC的开销哪?基本原则是尽量减少垃圾

(1) 减少人工干预,也就是人工调用System.gc()。虽然上述已经说过人工干预只是建议,但的确可能会触发主GC,增加停顿次数

(2) 尽量少使用 static 定义的静态全局变量,静态全局变量不会被GC回收,而是一直占用内存

(3) 多使用int,long,float等基本数据类型,少创建相应的Integer等对象,减少内存占用。同样多使用StringBuffer,少使用String,因为String在进行操作时会创建很多String对象。

(4) 避免突然创建大量对象或者突然删除大量对象,这两种操作都可能会触发GC

(5) 减少临时对象的使用,减少垃圾,或者在对象使用完成后,显示地设置为NULL,方便GC进行直接回收

 

以上是关于java——GC回收机制的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机 - GC 垃圾回收机制分析

Java垃圾回收机制是啥?

深入理解java虚拟机 - 垃圾回收机制(GC)

Java垃圾回收(GC)机制详解

Java GC(垃圾回收)机制知识总结

浅析JAVA的垃圾回收机制(GC)