JVM 深入簡出(一)

說到JVM 就必須先了解下什麼是JDK 什麼是JRE

如果你需要開發則需要安裝JDK如果只是允許java程序只需安裝jre 而JVM就是在JRE使用時產生的

JVM是運行在操作系統之上的、跨平臺的,之所以這麼說,因爲jre可以安裝在Linux、windows上 而且是編譯後的文件可以不同環境上只要安裝JRE就可以執行。

 

JVM 主要包含幾個區域:

堆、棧、方法區、本地方法區、程序計數器

程序計數器: 每個線程都有一個程序計數器,是線程私有的,也就是一個指針,存的是即將執行的指令代碼。類似線程計數。

本地方法區: 凡是帶了native關鍵字的,說明java的作用範圍達不到了,這會就會去調用底層的C語音庫,會進入本地方法棧,

調用本地方法接口也就是JNI,JNI主要作用就是擴展JAVA的使用,融合多種語音爲java服務。本地方法執行時會先看擴展方法(也就是jre etc目錄下的jar),如果沒有再找本地方法。比如我們常用對硬件操作類似打印機

棧: 存儲基本數據類型(byte short int long float double char boolean)和引用類型 遵循先進後出原則

        如果遞歸循環引用就會報出棧內存不足錯誤。 所以我們寫程序時要避免該問題。棧內存當線程結束也就釋放了。


堆: new出來的對象,數組, jvm只有一個堆區,並被所有線程共享。

 

方法區域(又叫 靜態區):所以class  字符串常量 和定義爲static的靜態變量, 被所有線程共享,

                                       存放程序中永遠唯一的元素。

 

JVM GC怎麼判斷對象可以被回收了?

對象沒有引用

作用域發生未捕獲異常

程序在作用域正常執行完畢

程序執行了System.exit()

程序發生意外終止(被殺線程等) ~~kill

作用域也也就是對象使用、引用 不被使用則被GC

 

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