GC:是什么,什么情況下會發生GC,如何優化GC,GC針對的對象,GC原理,什么對象會被保留什么對象會被回收
GC:垃圾回收機制(Gbbage Collection) ,對內存中不可達對象進行回收,進而釋放內存資源,避免內存溢出的問題。
GC針對的對象 ,如果一個對象沒有指向它的引用或者其賦值為null,則次對象適合進行垃圾回收.
GC原理,根據計數器,當一個對象被引用此對象計數+1,當一個對象未被引用計數-1,當計數為0時,符合被回收的規則
如何優化GC,將使用一次使用的對象賦值為null
可達性分析算法來判斷對象的存活狀態的。
可達和不可達,可達是指一個對象仍然被引用,不可達是一個對象未被引用
不可用可達
如果一個對象沒有指向它的引用或者其賦值為null,則次對象適合進行垃圾回收.
什么情況下會發生GC,GC分為兩類:Minior GC 和Full GC
當新生帶空間不足時會發生MiniorGC,
每次發生MiniorGC時,或判斷歷來由新生代進入老年的平均大小,如果平均值大於老年的則發生Full GC,如果小於老年代則是MiniorGC
Full GC,當老年代不足時,當方法區內存空間不足,當對中分配較大的對象,當發生minior GC時有概率發生
內存溢出問題
內存泄漏和內存溢出
內存溢出:指程序申請內存時,沒有足夠的內存供申請者使用,導致數據無法正常存儲到內存中。也就是說給你個int類型的存儲數據大小的空間,但是卻存儲一個long類型的數據,這樣就會導致內存溢出。
內存泄漏:是指程序在申請內存后,無法釋放已申請的內存空間,導致系統無法及時回收內存並且分配給其他進程使用。通常少次數的內存無法及時回收並不會到程序造成什么影響,但是如果在內存本身就比較少獲取多次導致內存無法正常回收時,就會導致內存不夠用,最終導致內存溢出
堆溢出:堆中存放的是一些公共的對象
棧溢出:私有變量和對象
方法區和運行時常量池溢出:
heap
堆溢出:
創建對象過大,創建對象過多,但是不被回收
並發訪問量大,訪問數據過多,時間過長,導致數據釋放不掉,GC無法回收。
解決:先排除代碼問題,避免創建大對象,不用的對象及時置null , 避免無效的引用,其次設置內存參數,設置jvm值的方法是通過-Xms(堆的最小值),-Xmx(堆的最大值)
Stack
棧溢出:
遞歸創建對象,導致棧溢出
分配的棧空間過大調用的線程同時過多,當時棧溢出
Xmn、Xms、Xmx、Xss都是JVM對內存的配置參數,我們可以根據不同需要區修改這些參數,以達到運行程序的最好效果。
-Xms 堆內存的初始大小,默認為物理內存的1/64
-Xmx 堆內存的最大大小,默認為物理內存的1/4
-Xmn 堆內新生代的大小。通過這個值也可以得到老生代的大小:-Xmx減去-Xmn
-Xss 設置每個線程可使用的內存大小,即棧的大小