當前位置:首頁 » 編程語言 » java中gc

java中gc

發布時間: 2022-09-14 19:45:28

A. 了解java GC 工作中哪些場景需要用到,需要考慮到

GC的時候一般是內存不夠了或者發生了內存泄漏。
請注意:內存不夠用和內存泄漏是兩個概念,不懂的話,請問度娘。
比如,你是一名Java後端工程師,從事大數據開發相關的崗位,那麼你在寫程序的時候就需要結合java GC的原理,對你的程序進行優化。
大白話講,內存就那麼多,優秀的工程師可以讓它的利用率最高。
了解GC原理有助於你達到這一目的。

B. Java系統中GC頻繁啟動是什麼原因

GC頻繁發生的原因是堆空間不足。
修改permanent的大小是解決不了問題的,一般來說,permanent(持久帶)的變化並不大,如果持久帶不夠用,一般不會GC,而是直接拋出持久帶的OOM( out of memory)
所以,解決該公司的問題,最重要的是提高最小堆空間-Xms和最大堆空間-Xmx 的大小,提高年輕帶-Xmn有助於在一定的程度解決GC的問題,但是注意,這些只是很簡單的討論。個人覺得,頻繁GC發生的問題,最好是看看內存的DUMP文件,進行分析,在對JVM參數進行相對的配置。
JVM相關的問題還是比較復雜的,並不是幾句對參數的描述就能解決問題,你還是要多看JVM相關資料。
評論(0)

C. Java中GC會回收static定義的方法中的對象嗎

請將head中的d順時針旋轉180度。ps:gc不會主動回收static變數所指向的對象,因為static變數被作為gc roots,請google之!

D. java中GC是什麼為什麼要有GC

GC是垃圾回收的意思(gabage collection),內存處理器是編程人員容易出現問題的地方,忘記或者錯誤的內存回收導致程序或者系統的不穩定甚至崩潰,java的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,java語言沒有提供釋放已分配內存的俄顯示操作方法。

希望能幫到你,謝謝!

E. Java中 gc的作用是什麼

System.gc()用來強制立即回收垃圾,即釋放內存。
java對內存的釋放採取的垃圾自動回收機制,在編程的時候不用考慮變數不用時釋放內存,java虛擬機可以自動判斷出並收集到垃圾,但一般不會立即釋放它們的內存空間,當然也可以在程序中使用System.gc()來強制垃圾回收,但是要注意的是,系統並不保證會立即進行釋放內存

F. 在Java中如何主動調用GC

Java的公有API可以主動調用GC的有兩種辦法,一個是

System.gc();
// 或者下面,兩者等價
Runtime.getRuntime().gc();

還有一個是JMX:
java.lang.management.MemoryMXBean.gc()
作用跟System.gc()也是類似的。
MemoryMXBean.gc()和System.gc()的內部實現都是Runtime.getRuntime().gc(),從效果上說兩者一模一樣沒有區別。

G. java的gc為什麼要分代

假如哈,現在的計算機能做的1ms掃描完所有live object,10ms完成live set的整理(compaction),大多數java應用都會覺得「這沒毛病了」,那麼,現在Hotspot JVM設計的那幾套GC演算法組合確實就沒意義了。下面,再繼續談一哈GC的哲學。類似分布式系統的CAP theorem,GC演算法設計也是有這個3取2的三角組合的:即延時(latency)、吞吐(throughput)和內存消耗(footprint)。基本的設計原理就是footprint為有限值的條件下,我們再在latency和throughput上挑一個優化,比如Hotspot JVM實現中,CMS演算法主攻latency,Parallel GC 主攻throughput,G1 GC較關注latency同時兼顧一點throughput。來來來,我們開個腦洞:我們能不能放棄或減弱「footprint為有限值」這個條件。嗯~比如,一個應用1小時使用100G memory(暫時不管這100G會產生多少垃圾),伺服器24小時會重啟一次,那麼,每次重啟前java應用需要使用的內存會達到2,400G。也就是說,在這個case中,java能使用的內存如果能大於2,400G,我們根本就是不需要任何GC演算法,not to mention 什麼分代了; 「java的gc為什麼要分代」的哲學又是啥。我認為,是熵增原理 和 80/20法則。

H. java方法區有沒有gc

java方法區是存在GC的

回收方法區

方法區即為永久代,主要回收兩部分內容:廢棄常量和無用類。

滿足以下3個條件的類稱之為無用類

  • 該類所所有的對象實例已經被回收,也就是java堆中不存在該類的任何實例

  • 載入該類的ClassLoader已經被回收

  • 該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

  • 在大量使用反射、動態代理、CGLib等ByteCode框架、動態生成JSP以及OSGI這類頻繁自定義ClassLoader的場景都需要虛擬機具備類卸載的功能,以保證永久帶不會溢出。

I. 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"。

熱點內容
微信里的密碼和賬號在哪裡 發布:2025-01-11 22:46:04 瀏覽:750
java字元串個數統計 發布:2025-01-11 22:45:05 瀏覽:541
完美國際2捏臉資料庫 發布:2025-01-11 22:45:04 瀏覽:279
php淘寶互刷平台源碼 發布:2025-01-11 22:43:49 瀏覽:215
劍俠情緣緩存怎麼清理 發布:2025-01-11 22:33:56 瀏覽:316
win7旗艦版怎麼設置密碼 發布:2025-01-11 22:21:09 瀏覽:144
被害人訪問 發布:2025-01-11 22:06:24 瀏覽:366
朋友圈上傳長視頻方法 發布:2025-01-11 22:01:41 瀏覽:357
我的世界ice伺服器被炸罰款 發布:2025-01-11 21:54:36 瀏覽:725
linuxphpini配置 發布:2025-01-11 21:54:35 瀏覽:481