JVM堆記憶體設定
今天碰到了一個題目,講的是關於堆記憶體的問題,題目如下
下面哪種情況會導致持久區jvm堆記憶體溢位?
A.迴圈上萬次的字串處理
B.在一段程式碼內申請上百M甚至上G的記憶體
C.使用CGLib技術直接操作位元組碼執行,生成大量的動態類
D.不斷建立物件序列GC是在整個掃描和複製過程採用單執行緒的方式來進行,適用於單CPU、新生代空間較小及對暫停時間要求不是非常高的應用上,是client級別預設的GC方式。
這個題目的答案選擇C,我在做這個題之前對於JVM的瞭解幾乎為0,所以看到這個題目基本就是隨便選了一個,甚至沒有看到原題中是持久區堆記憶體,只以為是記憶體溢位。所以在做完這個題目以後瞭解了一下JVM。
JVM是指Java虛擬機器,JVM又分為了棧,堆,方法區,本地方法棧等幾個部分,因為這個題目的緣故,重點了解了下堆。
1.棧
每一個執行緒執行的時候都會在棧申請開闢一塊棧幀。每個棧幀包括區域性變數區和運算元棧,用於存放此次方法呼叫過程中的臨時變數、引數和中間結果。
2.方法區
方法區用來存放要載入的類資訊、靜態變數、final型別的常量、屬性和方法資訊。
3,本地方法棧
本地方法棧用來支援native方法的執行,儲存每個native方法的呼叫狀態。
4.堆
程式碼中每new一個新物件,都會在堆中建立,然後下面重點了解了一下堆。
堆記憶體設定
堆分為兩部分,Permanent和head,Permanent Generation即持久帶。
head又分為Young Generation和Old Generation,即年輕代和年老代。
年輕代又分為Eden和Survivor。
Survivor又分為From和To。
年輕代
所有新建立的物件都放在新生代中,新生代的作用主要就是回收那些生命週期比較短的物件。
年老代
相對應的,老年代就存放那些生命週期比較長的物件。
這也就涉及到了垃圾回收機制。
因為年輕代中物件存活時間短,所以採用Copying演算法,簡單說就是把存活物件從一個區域拷貝到另一個區域,對應年輕代中就是Eden和From,To之間的拷貝,當觸發GC進行回收依然空間不足就回進去年老代,年老代滿了,進行Full GC,騰出的空間依然不足的話,就回出現記憶體溢位的錯誤OutOfMemory。比如開頭寫的那個題目中的ABD選項都是該原因導致的記憶體溢位。
而持久區則不同,持久區用於存放靜態型別資料,如Java Class, Method 等。持久代對垃圾回收沒有顯著影響。但是有些應用可能動態生成或呼叫一些Class,例如前面題目的C選項,在這種時候往往需要設定一個比較大的持久代空間來存放這些執行過程中動態增加的型別。
最後簡單記錄垃圾回收的一點知識
並行回收GC是在整個掃描和複製過程採用多執行緒的方式來進行,適用於多CPU、對暫停時間要求較短的應用上,是server級別預設採用的GC方式。
並行GC要與舊生代的併發GC配合使用
舊生代的GC與新生代不同,物件存活的時間比較長,比較穩定,因此採用Mark演算法來進行回收,所謂標記就是掃描出存活的物件,然後再進行回收未被標記的物件,回收後空出的空間要麼進行合併,要麼標記出來便於下次進行分配,總之就是要減少記憶體碎片帶來的效率損耗。
相關文章
- JVM 堆記憶體設定原理JVM記憶體
- eclipse設定JVM記憶體堆EclipseJVM記憶體
- jvm 堆記憶體JVM記憶體
- JVM堆記憶體詳解JVM記憶體
- eclipse中設定JVM記憶體EclipseJVM記憶體
- JVM堆外記憶體問題排查JVM記憶體
- jvm堆記憶體和GC簡介JVM記憶體GC
- 探索JVM的垃圾回收(堆記憶體)JVM記憶體
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- 【JVM之記憶體與垃圾回收篇】堆JVM記憶體
- 【JVM】堆體系結構及其記憶體調優JVM記憶體
- 關於虛擬機器記憶體和JVM記憶體設定的思考虛擬機記憶體JVM
- 關於JVM堆外記憶體的一切JVM記憶體
- 使用mtrace追蹤JVM堆外記憶體洩露JVM記憶體洩露
- 從記憶體洩露、記憶體溢位和堆外記憶體,JVM優化引數配置引數記憶體洩露記憶體溢位JVM優化
- 探索JVM的堆記憶體分佈:官方圖片展示JVM記憶體
- JVM原始碼分析之堆外記憶體完全解讀JVM原始碼記憶體
- Java堆記憶體Heap與非堆記憶體Non-HeapJava記憶體
- JS中的棧記憶體、堆記憶體JS記憶體
- 直接記憶體和堆記憶體誰快記憶體
- windows核心程式設計--記憶體堆疊Windows程式設計記憶體
- NameNode堆記憶體估算記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- [轉載] Java直接記憶體與堆記憶體Java記憶體
- JVM記憶體分析JVM記憶體
- JVM記憶體模型JVM記憶體模型
- JVM(七):JVM記憶體結構JVM記憶體
- java 堆外記憶體排查Java記憶體
- JVM記憶體-GC策略JVM記憶體GC
- JVM 記憶體區域JVM記憶體
- 【JVM記憶體區域】JVM記憶體
- JVM記憶體結構JVM記憶體
- JVM-記憶體模型JVM記憶體模型
- jvm 記憶體洩漏JVM記憶體
- JVM記憶體模型(五)JVM記憶體模型
- HotSpot JVM 記憶體管理HotSpotJVM記憶體
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- JVM系列(二) - JVM記憶體區域JVM記憶體
- linux 設定預留記憶體Linux記憶體