Java中的垃圾回收(GC)是一個(gè)自動化的過程,它會在運(yùn)行時(shí)查找不再被需要的對象,然后釋放它們的內(nèi)存。GC可以分為兩類:小GC和大GC。
小GC是指在新生代內(nèi)存(young generation)進(jìn)行的垃圾回收。新生代內(nèi)存是分為兩部分:Eden區(qū)(年輕代對象的出生區(qū))和Survivor區(qū)。當(dāng)Eden區(qū)滿時(shí),會觸發(fā)小GC。GC會先將存活的對象從Eden區(qū)和Survivor區(qū)整理到另一個(gè)Survivor區(qū),然后清除掉不再被需要的對象。對于大部分Java程序,小GC會發(fā)生很多次。
public class SmallGcExample { public static void main(String[] args) { byte[] b1 = new byte[1024 * 1024]; System.out.println("分配了1MB內(nèi)存"); byte[] b2 = new byte[1024 * 1024]; System.out.println("分配了1MB內(nèi)存"); byte[] b3 = new byte[1024 * 1024]; System.out.println("分配了1MB內(nèi)存"); byte[] b4 = new byte[1024 * 1024]; System.out.println("分配了1MB內(nèi)存"); } }
以上代碼會在堆內(nèi)存中分配了4個(gè)1MB的對象,當(dāng)Eden區(qū)滿時(shí),會觸發(fā)小GC。
相比之下,大GC(Full GC)則是在老年代內(nèi)存(old generation)進(jìn)行的垃圾回收。老年代內(nèi)存是用來保存長時(shí)間存活的對象。當(dāng)老年代內(nèi)存被使用完了,會觸發(fā)大GC。大GC會清除所有不再被需要的對象,包括新生代和老年代的對象。在大部分情況下,大GC會比小GC花費(fèi)更多的時(shí)間。
public class LargeGcExample { public static void main(String[] args) { byte[] b1 = new byte[1024 * 1024 * 10]; System.out.println("分配了10MB內(nèi)存"); byte[] b2 = new byte[1024 * 1024 * 10]; System.out.println("分配了10MB內(nèi)存"); byte[] b3 = new byte[1024 * 1024 * 10]; System.out.println("分配了10MB內(nèi)存"); byte[] b4 = new byte[1024 * 1024 * 3]; System.out.println("分配了3MB內(nèi)存"); byte[] b5 = new byte[1024 * 1024 * 3]; System.out.println("分配了3MB內(nèi)存"); } }
以上代碼會在堆內(nèi)存中分配了5個(gè)對象,其中前三個(gè)對象共占用30MB的老年代內(nèi)存,當(dāng)老年代內(nèi)存被使用完后,會觸發(fā)大GC。
因此,在Java程序中,需要注意內(nèi)存的使用和釋放,避免出現(xiàn)內(nèi)存泄漏等問題,從而避免頻繁的垃圾回收觸發(fā),影響程序性能。