jvm 安装位置_简单了解JVM
1、JVM的位置:JVM是在操作系統(tǒng)上面的應用軟件
JVM虛擬機有三種如下:
① Sun公司的HotSpot;
② BEA公司的JRockit;
③ IBM公司的J9 JVM;
java虛擬機屬于第一種:
2、JVM的體系結(jié)構(gòu):
3、類加載器
作用:加載class文件 -------(類是模板,對象是具體的)
簡單執(zhí)行過程:
雙親委派機制:
定義:在程序運行時某個類加載器需要加載某個.class文件時,它首先把這個任務委托給他的上級類加載器(即ExtClassLoader),ExtClassLoader加載器在把任務委托給他的上級類BootstrapClassLoader,如果BootstrapClassLoader沒有加載就到ExtClassLoader加載,如果ExtClassLoader沒有加載就自己加載,按照這個遞歸這個操作,來完成加載該文件的機制就稱為雙親委派機制
類加載器的類別:
(1)BootstrapClassLoader(啟動類加載器)
它是由C++寫的,加載java核心庫-->java.*;java/lib目錄下的jar,自己復制進去也會加載,但是java環(huán)境會被不壞
(2)ExtClassLoader(標準擴展類加載器)
它是由java寫的,加載擴展庫即java/lib/ext目錄下的jar,java.ext.dir 指定位置中的類,開發(fā)者可以直接使用標準擴展類加載器。
(3)AppClassLoader(系統(tǒng)類加載器)
它是由java寫的,加載程序所在的目錄,我們自己寫的類大多數(shù)使用這個如user.dir所在的位置的class
(4)CustomClassLoader(用戶自定義類加載器)
它是由java寫的,用戶自定義的類加載器,可加載指定路徑的class文件,Tomcat實現(xiàn)就是有自己的加載器
雙親委派機制的作用:
1)、防止加載相同的class文件,保證數(shù)據(jù)的安全
2)、防止核心類被破壞,造成java環(huán)境的污染
4、沙箱安全機制
防止遠程代碼(病毒)入侵
5、native
凡是帶native關(guān)鍵字的,說明java的作用范圍達不到了,只能調(diào)用C語言的庫;會進入本地方法棧;然后會調(diào)用本地接口(JNI),JNI作用:擴展java的使用,融合不同的語言為java所用;最初的C、C++,它在內(nèi)存區(qū)域中專門打開調(diào)了一塊標志區(qū)域:本地方法棧,登記native方法
例子:源碼:Thread的類中的----》private native void start0();
6、PC寄存器
1)、PC寄存器( PC register ):每個線程啟動的時候,都會創(chuàng)建一個PC(Program Counter,程序計數(shù)器)寄存器。PC寄存器里保存有當前正在執(zhí)行的JVM指令的地址。 每一個線程都有它自己的PC寄存器,也是該線程啟動時創(chuàng)建的。保存下一條將要執(zhí)行的指令地址的寄存器是 :PC寄存器。PC寄存器的內(nèi)容總是指向下一條將被執(zhí)行指令的地址,這里的地址可以是一個本地指針,也可以是在方法區(qū)中相對應于該方法起始指令的偏移量。
2)、每個線程都有一個程序計數(shù)器,是線程私有的,就是一個指針,指向方法區(qū)中的方法字節(jié)碼(用來存儲指向下一條指令的地址,也即將要執(zhí)行的指令代碼),由執(zhí)行引擎讀取下一條指令,是一個非常小的內(nèi)存空間,幾乎可以忽略不記。
3)、這塊內(nèi)存區(qū)域很小,它是當前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼解釋器通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。
4)、如果執(zhí)行的是一個Native方法,那這個計數(shù)器是空的。
7、方法區(qū):
方法區(qū)(Method Area)與 Java 堆一樣,是所有線程共享的內(nèi)存區(qū)域。
靜態(tài)變量、常量、類信息(構(gòu)造方法、接口定義)、運行時的常量池存在方法區(qū)中,但是實例變量存在堆內(nèi)存中和方法區(qū)無關(guān)
8、棧:(先進后出、后進先出)數(shù)據(jù)結(jié)構(gòu)
定義:棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
程序=數(shù)據(jù)結(jié)構(gòu)+算法
程序執(zhí)行方法,就是靠棧來調(diào)用,最先把main()方法壓在棧的底部,其它方法在上面,等到main()出棧程序執(zhí)行也就結(jié)束了。
所以棧是不存在垃圾回收問題
9、堆
Heap,一個JVM只有一個堆內(nèi)存,堆內(nèi)存的大小是可以調(diào)節(jié)的
類加載器讀取了類文件后,一般會把類、方法、常量、變量,保存我們所有引用類型的真實對象
堆內(nèi)存中分成三個區(qū)域:
1)、新生區(qū)(伊甸區(qū))
2)、養(yǎng)老區(qū)
3)、永久存儲區(qū)
所有GC垃圾回收是在堆里的伊甸區(qū)和養(yǎng)老區(qū)
jdk8后把永久區(qū)名稱改為元空間
新生區(qū):
類:誕生和成長的地方,甚至死亡
伊甸區(qū):所有對象都是在這里new出來的,即實例化
幸存區(qū)(0 1):
養(yǎng)老區(qū):
永久區(qū):這個區(qū)域常駐內(nèi)存的,用來存放攜帶的class對象,interface元數(shù)據(jù),存儲的是java運行時的一些環(huán)境或類信息,這個區(qū)域不存在垃圾回收
jdk1.6:永久代、常量池在方法區(qū)
jdk1.7:永久代、但是慢慢的退化,常量池在堆中
jdk1.8之后:無永久代、常量池在元空間
OOM定義:OOM,全稱“Out Of Memory”,翻譯成中文就是“內(nèi)存用完了”,來源于java.lang.OutOfMemoryError。看下關(guān)于的官方說明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是說,當JVM因為沒有足夠的內(nèi)存來為對象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時,就會拋出這個error(注:非exception,因為這個問題已經(jīng)嚴重到不足以被應用處理)。
遇到OOM問題:
參考:https://www.cnblogs.com/zhoading/p/10249302.html
(1)調(diào)堆內(nèi)存大小;
修改堆的大小:
說明:
-Xms:20M 初始化堆內(nèi)存大小
-Xmn:20M 堆內(nèi)存最大值
-Mmn:10M 新生代內(nèi)存設置
-XX:+PrintGcDetails 用于打印GC的日志信息
-verbose:gc 用于查看Java垃圾收集的結(jié)果
idea界面:
(2)分析內(nèi)存
分析堆內(nèi)存工具:MAT(eclipse)、Jprofiler(idea)
MAT、Jprofiler作用:快速分析Dump內(nèi)存文件,快速定位內(nèi)存泄漏
VM參數(shù):https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
要在idea安裝插件Jprofiler
(1)安裝:https://www.cnblogs.com/javabg/p/11499098.html
(2)使用:https://segmentfault.com/a/1190000021881331
10、GC(垃圾回收)
GC的作用區(qū)域:方法區(qū),堆
JVM在進行GC時,并不是三個統(tǒng)一回收,大部分時候,回收新時代
年輕代:存活率低-》復制算法
幸存區(qū)(form,to------》誰空誰是to)
老年區(qū):存活率大-》標記清除算法(內(nèi)存碎片不是太多)、標記壓縮混合實現(xiàn)
GC兩種類:輕GC(普通的GC)、重GC(全局GC)
GC的算法:標記清除法、標記整理、復制算法、引用計數(shù)法
參考:https://blog.csdn.net/qq_21383435/article/details/80473540
總結(jié):
內(nèi)存效率:復制算法>標記清除算法>標記壓縮算法
內(nèi)存整齊度:復制算法=標記壓縮算法>標記清除算法
內(nèi)存利用率:標記清除算法=標記壓縮算法>復制算法
11、舉例
(1)JMM(java Memory Model)-》Java內(nèi)存模型
1)定義:(java Memory Model)-》Java內(nèi)存模型
2)作用:緩存一致性協(xié)議,用于定義數(shù)據(jù)讀寫的規(guī)則(遵循)
參考:https://blog.csdn.net/zjcjava/article/details/78406330
3)如何學習?
面試題:https://www.cnblogs.com/wjh123/p/11094622.html
總結(jié)
以上是生活随笔為你收集整理的jvm 安装位置_简单了解JVM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql创建表属性引_【学习之Mysq
- 下一篇: c语言error和,C语言ERROR精选