快速了解Java虛擬機(JVM),看這兒就夠了

      網友投稿 1035 2022-05-30

      一、JVM相關概念匯總

      JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

      1、JVM內存圖

      2、JVM類加載器

      在類加載階段,通過一個類的全限定名來獲取描述該類的二進制字節流的這個動作的“代碼”被稱為“類加載器”(Class Loader),這個動作是可以自定義實現的。

      類加載器也是一段程序,一段代碼,代碼可能是c或c++、Java所編寫,主要是讀取磁盤下或jar包中的Class文件,裝載到jvm中

      虛擬機自帶的類加載器

      啟動類加載器(rt.jar) 根加載器 C++實現的

      擴展類加載器 (擴展的類)extends ClassLoader

      應用程序加載器(自己寫的類) extends ClassLoader

      3、雙親委派模型

      如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。

      快速了解Java虛擬機(JVM),看這兒就夠了

      每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟動類加載器中。只有當上一層類加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到這個類)時,下一層類加載器才會嘗試自己去加載。

      三個加載器都加載不到就會拋出 ClassNotFund異常

      JDK設計雙親委派模型的好處:

      確保安全,避免核心類庫被修改

      避免重復加載

      保證類的唯一性。

      雙親委派模型可以被打破,需要自定義類加載器,繼承ClassLoader類,重寫LoadClass方法。

      native:

      使用native關鍵字時,會去調用底層的c語言的庫

      進入本地方法棧,調用本地方法的本地接口 JIN

      JIN作用:擴展java的使用,融合不同的語言為java所有

      方法區主要存放:靜態變量,常量,類信息,常量池。

      4、堆

      一個JVM只有一個堆內存,堆內存大小可以調節。

      類加載器讀取了類文件會把,類,方法,常量,變量,保存所有引用類型的真實對象。

      堆內存主要分為三個區域:新生區(伊甸園)、老年區、永久區。

      堆、元空間(方法區)是線程共享的;其他區域是線程私有的

      特點及作用:

      1、線程共享的一塊區域;

      2、虛擬機啟動時創建;

      3、虛擬機所管理的內存中最大的一塊區域;

      4、存放所有實例對象或數組;

      5、GC垃圾收集器的主要管理區域;

      6、可分為新生代、老年代;

      7、新生代更細化可分為Eden、

      From Survivor、To Survivor,Eden:Survivor = 8:1:1

      8、可通過-Xmx、-Xms調節堆大小;

      9、無法再擴展

      java.lang.OutOfMemoryError: Java heap space

      GC垃圾回收機制:主要回收新生區和老年區

      堆內存滿,拋出,OOM錯誤。 JDK8之前叫永久存儲區,JDK8之后叫元空間。 邏輯上存在,物理上不存在

      新生區:

      類誕生和成長,直到死亡的地方

      所有的對象都在伊甸園區new出來

      老年代:

      ·當新生代經歷15次輕GC后還存在引用的,則被轉移到老年代

      永久區:

      永久區常駐內存,用來存放JDK自身攜帶的Class對象,interface元數據,存儲的是Java運行的一些環境,這個區域不存在垃圾回收。關閉虛擬機時,釋放這個區域的內存。

      OOM:

      -Xms:設置初始化分配內存大小 1/64 -Xmx:設置最大分配內存1/4

      -XX:+PrintGCDetails GC清理垃圾信息 -XX:+HeapDumpOnOutOfMemoryError dumpOOM錯誤文件

      嘗試擴大內存空間看結果,如果還有錯誤,分析代碼是否出現垃圾代碼或者死循環。

      內存快照分析工具,MAT,Jprofiler 作用:

      ①分析Dump內存文件,快速定位內存泄漏 ②獲得堆中數據 ③獲得最大對象

      5、GC

      作用區域:堆(堆+方法區(非堆)))

      GC兩種類型:輕GC 針對新生代和偶爾的幸存區(from,to) 重GC(全局GC)

      GC的算法:標記清除法 不需要額外內存空間,兩次掃描,浪費時間,產生內存碎片 、標記壓縮,復制算法(新生代、伊甸園區 )伊甸園區和to區為空,引用計數器

      GC算法總結:

      內存效率:復制算法>標記清除算法>標記壓縮算法(時間復雜度)

      內存整齊度:復制算法=標記壓縮算法>標記清除

      內存利用率:標記壓縮算法=標記清除>復制算法

      新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么區別?

      新生代回收器:Serial、ParNew、Parallel Scavenge

      老年代回收器:Serial Old、Parallel Old、CMS

      整堆回收器:G1

      新生代垃圾回收器一般采用的是復制算法,復制算法的優點是效率高,缺點是內存利用率低;老年代回收器一般采用的是標記-整理的算法進行垃圾回收。

      6、棧

      特點及其作用:

      1、線程私有;

      2、方法執行會創建棧幀,存儲局部變量表等信息;

      3、方法執行入虛擬機棧,方法執行完出虛擬機棧;(先進后出)

      4、棧深度大于虛擬機所允許StackOverflowError;

      5、棧需擴展而無法申請空間OutOfMemoryError(比較少見);hotspot虛擬機沒有;

      6、棧里面運行方法,存放方法的局部變量名,變量名所指向的值(常量值、對象值等)都存放到堆上的;

      7、棧一般都不設置大小,棧所占的空間其實很小,可以通過-Xss1M進行設置,如果不設置默認為1M;

      8、隨線程而生,隨線程而滅;

      9、該區域不會有GC回收。

      Java JVM 虛擬化

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如果你連業務領域建模都不會,那還怎么做架構師呢?
      下一篇:網絡相關術語名詞解析
      相關文章
      国产亚洲日韩一区二区三区| 极品色天使在线婷婷天堂亚洲| 亚洲av无码专区首页| 亚洲AV无码乱码在线观看代蜜桃| 久久精品国产亚洲AV香蕉| 婷婷久久久亚洲欧洲日产国码AV | 亚洲欧洲中文日韩久久AV乱码| 亚洲欧洲免费无码| 亚洲午夜精品一区二区麻豆| 亚洲欧洲日本在线观看| 亚洲成A人片在线播放器| 亚洲视频无码高清在线| 91在线亚洲综合在线| 亚洲中文字幕一二三四区| 亚洲欧洲日韩极速播放| 亚洲人成网站免费播放| 亚洲乱妇老熟女爽到高潮的片| 亚洲经典千人经典日产| 亚洲精品色播一区二区| 国产青草亚洲香蕉精品久久| 亚洲?V无码乱码国产精品| 亚洲乱码中文字幕手机在线| 亚洲性久久久影院| 亚洲人成网亚洲欧洲无码久久| 亚洲精品午夜国产VA久久成人| 亚洲乱码日产一区三区| 亚洲AV无一区二区三区久久| 亚洲卡一卡2卡三卡4卡无卡三| 91亚洲一区二区在线观看不卡| 亚洲精品中文字幕乱码影院| 久久久久se色偷偷亚洲精品av | 亚洲成人黄色在线| 亚洲天堂2016| 亚洲国产午夜精品理论片在线播放| 亚洲AV成人片无码网站| 亚洲人成无码网站久久99热国产| 国产亚洲?V无码?V男人的天堂| 亚洲精品V欧洲精品V日韩精品| 亚洲人成网站影音先锋播放| 亚洲成人福利在线观看| 亚洲无人区码一二三码区别图片|