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进行直接回收