❶ java垃圾回收那點事究竟有多少GC
GC不可怕,可怕的是經常FULL GC,讓整個JVM停止工作進行內存回收
常見的幾種觸發點如下
1、持久帶滿了,就是Permanet Generation滿了會導致FULL GC,如果GC不成功,那就報out of memory了
2、舊生代滿了,導致FULL GC
3、新生代向S0和S1轉移數據,S0和S1向舊生代轉移數據,結果兩邊的內存設置都比較小,持續出現,會導致FULL GC
4、系統直接system.gc
常見的調整方法就是在server和client模式下調整我們的GC策略來滿足特定場合的需要。一般情況下不需要做這方面的特別調優,只需要設置好持久帶和新生代(S0,S1,Eden)、舊生代的內存大小即可。java會自動回收當前的資源,如果有需要就自己調用full gc。
我們把GC分成4種類型
1. SerialGC
參數-XX:+UseSerialGC
就是Young區和old區都使用serial 垃圾回收演算法,
2. ParallelGC
參數-XX:+UseParallelGC
Young區:使用Parallel scavenge 回收演算法
Old 區:可以使用單線程的或者Parallel 垃圾回收演算法,由 -XX:+UseParallelOldGC 來控制
3. CMS
參數-XX:+UseConcMarkSweepGC
Young區:可以使用普通的或者parallel 垃圾回收演算法,由參數 -XX:+UseParNewGC來控制
Old 區:只能使用Concurrent Mark Sweep
4. G1
參數:-XX:+UseG1GC
沒有young/old區
❷ Java系統中GC頻繁啟動是什麼原因
GC頻繁發生的原因是堆空間不足。
修改permanent的大小是解決不了問題的,一般來說,permanent(持久帶)的變化並不大,如果持久帶不夠用,一般不會GC,而是直接拋出持久帶的OOM( out of memory)
所以,解決該公司的問題,最重要的是提高最小堆空間-Xms和最大堆空間-Xmx 的大小,提高年輕帶-Xmn有助於在一定的程度解決GC的問題,但是注意,這些只是很簡單的討論。個人覺得,頻繁GC發生的問題,最好是看看內存的DUMP文件,進行分析,在對JVM參數進行相對的配置。
JVM相關的問題還是比較復雜的,並不是幾句對參數的描述就能解決問題,你還是要多看JVM相關資料。
評論(0)
❸ java gc是什麼,為什麼要有gc
強制立即回收垃圾,即釋放內存。
java對內存的釋放採取的垃圾自動回收機制,在編程的時候,java虛擬機可以自動判斷出並收集的垃圾,但一般不會立即釋放它們的內存空間,當然也可以通過調用 System.gc()方法,來強制垃圾回收,但是要注意的是,系統並不保證會立即進行釋放內存
❹ 了解java GC 工作中哪些場景需要用到,需要考慮到
GC的時候一般是內存不夠了或者發生了內存泄漏。
請注意:內存不夠用和內存泄漏是兩個概念,不懂的話,請問度娘。
比如,你是一名Java後端工程師,從事大數據開發相關的崗位,那麼你在寫程序的時候就需要結合java GC的原理,對你的程序進行優化。
大白話講,內存就那麼多,優秀的工程師可以讓它的利用率最高。
了解GC原理有助於你達到這一目的。
❺ java中GC指的是什麼
gc是指垃圾回收機制,當一個對象不能再被後續程序所引用到時,這個對象所佔用的內存空間就沒有存在的意義了,java虛擬機會不定時的去檢測內存中這樣的對象,然後回收這塊內存空間。
❻ Java 等語言的 GC 為什麼不及時釋放內存
c語言沒有垃圾回收機制,所有new出來的內存都要手動釋放,優點是效率高,
一旦free立即執行,缺點是手動釋放xd.
java有獨立的gc線程,
而且由於gc線程執行優先順序很低,垃圾能不能及時回收取
決於gc策略和工作線程的執行密度.
❼ Java垃圾回收:GC在什麼時候對什麼做了什麼
1、首先,GC又分為minor GC 和 Full GC(major GC)。Java堆內存分為新生代和老年代,新生代中又分為1個eden區和兩個Survior區域。
2、一般情況下,新創建的對象都會被分配到eden區,這些對象經過一個minor gc後仍然存活將會被移動到Survior區域中,對象在Survior中沒熬過一個Minor GC,年齡就會增加一歲,當他的年齡到達一定程度時,就會被移動到老年代中。
3、當eden區滿時,還存活的對象將被復制到survior區,當一個survior區滿時,此區域的存活對象將被復制到另外一個survior區,當另外一個也滿了的時候,從前一個Survior區復制過來的並且此時還存活的對象,將可能被復制到老年代。因為年輕代中的對象基本都是朝生夕死(80%以上),所以年輕代的垃圾回收演算法使用的是復制演算法,復制演算法的基本思想是將內存分為兩塊,每次只有其中一塊,當這一塊內存使用完,就將還活著的對象復制到另一塊上面。復制演算法不會產生內存碎片。
4、在GC開始的時候,對象只會存在於eden區,和名為「From」的Survior區,Survior區「to」是空的。緊接著GCeden區中所有存活的對象都會被復制到「To」,而在from區中,仍存活的對象會根據他們的年齡值來決定去向,年齡到達一定只的對象會被復制到老年代,沒有到達的對象會被復制到to survior中,經過這次gc後,eden區和fromsurvior區已經被清空。這個時候,from和to會交換他們的角色,也就是新的to就是上次GC前的fromMinor GC:從年輕代回收內存。
5、當jvm無法為一個新的對象分配空間時會觸發Minor GC,比如當Eden區滿了。當內存池被填滿的時候,其中的內容全部會被復制,指針會從0開始跟蹤空閑內存。Eden和Survior區不存在內存碎片寫指針總是停留在所使用內存池的頂部。執行minor操作時不會影響到永久代,從永久帶到年輕代的引用被當成GC roots,從年輕代到永久代的引用在標記階段被直接忽略掉(永久代用來存放java的類信息)。如果eden區域中大部分對象被認為是垃圾,永遠也不會復制到Survior區域或者老年代空間。如果正好相反,eden區域大部分新生對象不符合GC條件,Minor GC執行時暫停的線程時間將會長很多。Minor may call "stop the world"。
❽ java中GC是什麼為什麼要有GC
gc是指垃圾回收機制,當一個對象不能再被後續程序所引用到時,這個對象所佔用的內存空間就沒有存在的意義了,java虛擬機會不定時的去檢測內存中這樣的對象,然後回收這塊內存空間。
❾ 如何優化java gc
內存(條)是便宜,很不幸,垃圾回收機制導致的暫停會嚴重影響系統性能,好像JVM內存最多支持2G,作者花費大量時間精力使用32G來提高系統性能,這篇是其心得。
GC微調是非常和應用有關,該篇的目標要求是:使用10G更大Heaps和嚴格的響應時間(毫秒級別),(吞吐量和延遲性是一對矛盾,這次GC微調主要是追求低延遲)。作者項目特點是:
1.Heap用於在內存中儲存數據結構
2.Heap大小超過10G
3.請求時間要求更快
4.事務是短的(幾百毫秒) 一個事務可以包括幾個請求
5.內存中數據修改頻率和面積低,不會一秒內修改整個10G內存,每秒更新10M即可。
此處省略垃圾回收機制原理介紹.....
總體來說,banq註:JVM分新生代和舊生代,新創建在新生代,通過新生代垃圾回收,如果不能被回收,將逐步轉入舊生代,舊生代內存可以實現緩存In-memeory數據,顯然新舊兩代的垃圾回收演算法最好不一樣,新生代需要頻繁,而舊生代不需要頻繁,如果我們內存緩存控製得好,舊生代就不會啟動垃圾回收機制,這樣就不會導致系統暫停。
❿ java中 已經觸發過GC清理,為什麼還會造成內存不足與GC的死循環呢
簡單地說,GC只會清理已經不會使用的對象內存,如果你的對象還要使用,即使GC也還會保留在內存的。如果在GC過後內存還是不足,GC就會繼續進行,造成死循環。