說到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