jvm學習第1day jvm簡介,棧溢出、堆溢出
- jvm簡介
- 棧線程安全
- 棧溢出
- 線程運行診斷
- 堆
- 堆溢出
- 方法區
- 方法區內存溢出
- 常量池和運行時常量池
jvm簡介
jvm 是編譯后的字節碼文件運行的環境, 因此各個平臺有了jvm可以運行java.class文件,這是Java跨平臺的原因。
jre jvm + 基礎類庫(日期類,集合類等) java run environment
jdk jre + 編譯工具 (Java Development Kit Java開發工具包)
javase jdk + Idea 有了java開發工具包jdk ,再需要一個編寫代碼的工具IDEA ,就可以進行java編碼
javaee javase + 應用服務器(例如Tomcat)
棧線程安全
程序計數器:很多線程,每個線程都要記錄下一個指令的地址,因此是私有的。
棧 :一個方法調用就是一個線程的開始,一個線程用的內存空間就是棧,這個方法可以嵌套方法。 方法中包含:參數,返回值,變量,都是需要占用內存的。
活動棧幀:正在執行的棧幀。(方法)
如果一個棧是1m,整個內存是500m,那么最多500個線程,如果一個棧2m,最多250個線程,并不是說棧越大越好,棧大了,只是可以遞歸的次數多了。
共享的需要考慮線程安全,私有的不需要考慮。
棧溢出
1.棧幀過多導致棧內存溢出 例如遞歸終止出現錯誤
2.棧幀過大導致棧內存溢出。
線程運行診斷
發生死鎖了:a要b b要a 但是a,b都已經被鎖定了。
堆
程序計數器 、虛擬機棧(只要不離開棧就是私有的)、本地方法棧;堆、方法區共享。
堆內存中的對象不被調用就會垃圾回收
堆溢出
java堆空間不足導致堆溢出。
方法區
方法區內存溢出
方法區是概念 實現有兩個:元空間 永久代
常量池和運行時常量池
指令 去常量區中找的什么類下的方法等功能。