下面哪種情況會導致持久區jvm堆內存溢出

下面哪種情況會導致持久區jvm堆內存溢出?正確答案: C   

循環上萬次的字符串處理
在一段代碼內申請上百M甚至上G的內存
使用CGLib技術直接操作字節碼運行,生成大量的動態類
不斷創建對象

 

JVM堆內存分爲2塊:Permanent Space 和 Heap Space。

  • Permanent 即 持久代(Permanent Generation),主要存放的是Java類定義信息,與垃圾收集器要收集的Java對象關係不大。
  • Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),New 即 年輕代(Young Generation)。年老代和年輕代的劃分對垃圾收集影響比較大。

年輕代

所有新生成的對象首先都是放在年輕代。年輕代的目標就是儘可能快速的收集掉那些生命週期短的對象。年輕代一般分3個區,1個Eden區,2個Survivor區(from 和 to)。

大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當一個Survivor區滿時,此區的存活對象將被複制到另外一個Survivor區,當另一個Survivor區也滿了的時候,從前一個Survivor區複製過來的並且此時還存活的對象,將可能被複制到年老代。

2個Survivor區是對稱的,沒有先後關係,所以同一個Survivor區中可能同時存在從Eden區複製過來對象,和從另一個Survivor區複製過來的對象;而複製到年老區的只有從另一個Survivor區過來的對象。而且,因爲需要交換的原因,Survivor區至少有一個是空的。特殊的情況下,根據程序需要,Survivor區是可以配置爲多個的(多於2個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。

針對年輕代的垃圾回收即 Young GC。

年老代

在年輕代中經歷了N次(可配置)垃圾回收後仍然存活的對象,就會被複制到年老代中。因此,可以認爲年老代中存放的都是一些生命週期較長的對象。

針對年老代的垃圾回收即 Full GC。

持久代

用於存放靜態類型數據,如 Java Class, Method 等。持久代對垃圾回收沒有顯著影響。但是有些應用可能動態生成或調用一些Class,例如 Hibernate CGLib 等,在這種時候往往需要設置一個比較大的持久代空間來存放這些運行過程中動態增加的類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章