JVM知識點 | 面試前專攻

1、JVM內存區域

在這裏插入圖片描述 線程共有:html

方法區:用於存放被JVM加載的類信息、常量、靜態變量、即時編譯器編譯的代碼java

永久代:存放的是class、method等元信息、類信息,常量,靜態變量 不會被GC回收,他們會一直佔用內存算法

jdk1.六、1.7時候:方法區指的就是永久代 jdk1.8時:方法區指的就是元空間數據庫

堆:全部的對象實例的建立都在堆內存中,因此會出現垃圾回收的操做 新生代:新建立的對象存放的位置(Eden、S0、S1) 老年代:新生代未回收的對象會被copy到老年代tomcat

程序計數器:當前線程執行字節碼的行號指示器性能優化

線程私有:markdown

虛擬機棧:java方法執行的內部模型、每一個方法執行都會建立一個棧幀(),每一個方法從開始調用到結束都對應一個棧幀在虛擬機上從入棧到出棧的過程jvm

本地方法棧:java執行本地方法oop

直接內存(堆外內存):一部分是不須要jvm管理的直接內存,也被稱爲堆外內存。堆外內存就是把內存對象分配在JVM堆意外的內存區域,這部份內存不是虛擬機管理,而是由操做系統來管理,這樣能夠減小垃圾回收對應用程序的影響性能

2、JVM內存溢出

  1. 堆溢出

堆是存放實例對象的,那咱們就無線建立實例對象。這樣堆區早晚會滿 解決方案: 設置jvm值的方法是經過-Xms(堆的最小值),-Xmx(堆的最大值) 2. 虛擬機棧/本地方法棧 方法調用層次過多(好比存在無限遞歸調用) 解決方案: 審查代碼、修改程序 經過 -Xss: 來設置每一個線程的Stack大小便可 4. 方法區 5. 直接內存 6. 元空間 在這裏插入圖片描述 致使OutOfMemoryError異常的常見緣由有如下幾種:

① 檢查對數據庫查詢中,是否有一次得到所有數據的查詢。通常來講,若是一次取十萬條記錄到內存,就可能引發內存溢 出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線後,數據庫中數據多了,一次查詢就有可能引發內存溢出。所以對於數據庫查詢儘可能採用分頁的方式查詢。
      ② 檢查代碼中是否有死循環或遞歸調用(遞歸調用時未給定停止條件)。
      ③ 檢查是否有大循環重複產生新對象實體。
      ④ 檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這                   些對象不能被GC回收;導入導出IO流未關閉流(應把close放在try..catch..finally的finally中)。
        處理流異常可參考:https://www.cnblogs.com/yhqtv-com/p/12880554.html

**查看內存使用狀況:**
>  一、 jstat -gc pid
>能夠顯示gc的信息,查看gc的次數,及時間。
> 其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。

>    二、ps -ef | grep tomcat
ps -ef 的意思是以長格式顯示全部進程
  「|」是管道,意思是前面ps的輸出作爲後面的輸入,而後grep tomcat是在全部進程裏查找與字符tomcat有關的進程,並顯               示出來。
複製代碼

3、垃圾回收

  1. 判斷對象是否可回收 在這裏插入圖片描述

  2. 回收算法 在這裏插入圖片描述

  3. 垃圾收集器 在這裏插入圖片描述

  4. 垃圾回收過程 在這裏插入圖片描述

4、性能優化

在這裏插入圖片描述 如何減小GC

  1. 儘可能減小臨時對象的使用 對象不用的時候儘可能顯示爲null
  2. 儘可能使用stringbuffer代替string 由於string是一個常量 對string的操做是建立新對象回收舊對象的一個操做,而stringbuffer和stringbuilder是變量,是對對象直接進行修改,不進行建立對象和回收舊對象的操做,不佔用內存
  3. 能有基本數據類型int long就不用引用數據類型 基本數據類型佔用的內存資源比相應的引用數據類型佔用的少

5、類加載

在這裏插入圖片描述

參考連接:blog.csdn.net/qq_41701956…

相關文章
相關標籤/搜索