Java架構學習(十二)java記憶體結構&新生代&老年代&JVM引數調優&堆記憶體引數配置&解決堆疊溢位
JVM引數調優與垃圾回收機制
一、java記憶體結構
Java記憶體模型:是多執行緒裡面的,jmm與執行緒可見性有關
Java記憶體結構:是JVM虛擬機器儲存空間。
Java記憶體結構圖
Java記憶體機構分為:方法區、java堆、棧、本地方法棧。 方法區(永久區):就是使用static關鍵字修飾的基本就是存放在方法區內。 一般來說都是存放常量資訊,在類載入的時候就會被初始化。 方法區就是全域性的。所有執行緒都會被共享的。 包括靜態工廠建立的物件。只要被static修飾的 Java堆:建立的物件、new建立的、陣列存放在堆記憶體。 調優策略就是調堆。 堆所有的執行緒會被共享的。 棧:定義基本的區域性變數、區域性方法、類的方法。 棧程式碼執行完畢後就會自動釋放記憶體。 棧是每個執行緒都是私有的。 互不共享,不會產生執行緒安全問題。 本地方法棧:主要是呼叫C語言的。jni
二、調優問題總結
1、在專案中,少定義static常量。否則垃圾回收機制根本就不會回收。
2、調優主要調堆。
3、儘量減少垃圾回收機制的次數,因為垃圾回收的時候執行緒會被卡死,當然時間很短
感受不到就是。
4、新生代回收次數儘量比老年代多。
三、垃圾回收的作用
垃圾回收機制:不定時的去回收堆記憶體空間的資源。
四、堆裡面的 新生代與老年代
什麼是堆?new 出來的物件都會存放在堆記憶體中。 堆記憶體中分配兩個區:新生代、老年代。目的就是垃圾回收機制。 垃圾回收機制主要是回收新生代裡面的物件。 新生代又分為:eden區、s0區、s1區。 s0區與s1區大小相等, 目的是垃圾回收機制複製演算法。 新生代:剛建立物件時候先存放在新生代。 老年代:如果物件在頻繁的使用,物件會放在老年代。 在jvm剛建立物件的時候會先放在eden區。 垃圾回收機制需要經常區老年代回收垃圾嗎? 不需要,因為老年代都是頻繁使用的物件。回收較少。 垃圾回收機制主要回收新生代。 如圖:
五、堆記憶體引數配置
引數配置:
-XX:+PrintGC 每次觸發GC的時候列印相關日誌
-XX:+UseSerialGC 序列回收
-XX:+PrintGCDetails 更詳細的GC日誌
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:SurvivorRatio 永安裡設定新生代中eden控制元件和from/to空間比例。
含義:-XX:SurvivorRatio=eden/from=den/to
總結:在實際工作的時候,我們可以直接將初始堆大小與最大堆大小配置相等。
這樣的好處是可以減少程式執行時垃圾回收次數。從而提高效率。
程式碼:檢視堆記憶體和使用記憶體
package com.leeue;
import java.text.DecimalFormat;
/**
*
* @classDesc: 功能描述:(配置堆記憶體初始值大小要與堆最大記憶體值相等。)
* @author:<a href="[email protected]">李月</a>
* @Version:v1.0
* @createTime:2018年7月31日 下午2:57:53
*/
public class Demo {
public static void main(String[] args) throws InterruptedException {
JvmInfo();
byte[] bytes01 = new byte[1*1024*1024];
System.out.println("分配了1M");
Thread.sleep(2000);
JvmInfo();
byte[] bytes02 = new byte[4*1024*1024];
System.out.println("分配了4M");
JvmInfo();
}
static private String toM(long maxMemory) {
float num = (float) maxMemory / (1024 * 1024);
DecimalFormat df = new DecimalFormat("0.00");// 格式化小數
String s = df.format(num);// 返回的是String型別
return s;
}
public static void JvmInfo() {
//最大記憶體配置資訊
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("最大記憶體配置:"+maxMemory+","+toM(maxMemory)+"M");
//當前空閒記憶體
long freeMemory = Runtime.getRuntime().freeMemory();
System.out.println("當前空閒記憶體:"+freeMemory+","+toM(freeMemory)+"M");
//已使用記憶體
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("已使用記憶體:"+totalMemory+","+toM(totalMemory)+"M");
}
}
設定最大堆記憶體
-Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
這裡配置了初始值是5M 最大值是20M
設定完成後 垃圾回收機制回收了兩次
設定完成後
配置新生代與老年代引數調優引數
-Xmn 新生代大小,一般設為整個堆的1/3到1/4左右
-XX:SurvivorRatio 設定新生代中eden區和from/to空間的比例關係n/1
引數:
-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:SurvivorRatio 設定新生代中eden區和from/to空間的比例關係n/1 如下圖
這個引數是配置新生代與老年代的比例關係
-Xms20m -Xmx20m
-XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2
-XX:NewRatio=2 表示新生代與老年代的關係是2:1 新生代佔兩份
六、JVM引數調優
1、設定初始堆大小要與最大堆大小配置相等。
2、設定新生代與老年帶回收比例。
JVM引數調優,怎麼讓垃圾回收機制經常區新生代進行回收?
答:新生代與老年代比例1/3或1/4
七、解決堆記憶體溢位
堆溢位:
解決方案:
-Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
棧溢位:產生於遞迴呼叫,迴圈遍歷是不會出現棧溢位的。但是迴圈方法裡
產生遞迴呼叫也會發生棧溢位
解決方案:設定執行緒最大呼叫深度
-Xss5m 設定執行緒最大呼叫深度。
Tomcat記憶體溢位在catalina.sh 修改JVM堆記憶體大小
JAVA_OPTS="-server -Xms800m -Xmx800m
-XX:PermSize=256m -XX:MaxPermSize=512m
-XX:MaxNewSize=512m"
相關推薦
Java架構學習(十二)java記憶體結構&新生代&老年代&JVM引數調優&堆記憶體引數配置&解決堆疊溢位
JVM引數調優與垃圾回收機制 一、java記憶體結構 Java記憶體模型:是多執行緒裡面的,jmm與執行緒可見性有關 Java記憶體結構:是JVM虛擬機器儲存空間。 Java記憶體結構圖 Java記憶體機構分為:方法區、java堆、棧、本地
Java語言學習(十二):多執行緒
Java中給多執行緒程式設計提供了內建的支援,多執行緒是多工的一種特別形式,它使用了更小的資源開銷。這裡需要知道兩個術語及其關係:程序和執行緒。 程序:程序是系統進行資源分配和排程的一個獨立單位。一個程序包括由作業系統分配的記憶體空間,包含
深入理解java虛擬機(十二) Java 語法糖背後的真相
它的 blog 需要 原來 ont 影響 else 階段 board 語法糖(Syntactic Sugar),也叫糖衣語法,是英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語。指的是,在計算機語言中添加某種語法,這些語法糖雖然不會對語言的功
深入理解 Java 虛擬機器(十二)Java 記憶體模型與執行緒
執行緒安全 Java 語言中的執行緒安全 根據執行緒安全的強度排序,Java 語言中各種操作共享的資料可以分為 5 類:不可變、絕對執行緒安全、相對執行緒安全、執行緒相容、執行緒對立。 不可變 不可變的物件一定是執行緒安全的,如果共享資料是一個基本資料型別,那麼
Java學習(十二)
sre sub utl 子接口 字符 匹配條件 流操作 數組array collect /**************************************************************/ /*在線程中更新圖形化界面,需要調用SwingUtilt
(十二)Java springcloud B2B2C o2o多使用者商城 springcloud架構-- SSO單點登入之OAuth2.0 登出流程(3)
上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */ @R
(十二)Java B2B2C多使用者商城 springboot架構-SSO單點登入之OAuth2.0 登出流程(3)
上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */ @R
(十二)Java B2B2C多用戶商城 springboot架構-SSO單點登錄之OAuth2.0
fff 用戶 red auth src ror 單點登錄 更多 watermark 上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據用戶名+密碼實現OAuth2.0的登錄認證的流程圖,今天我們看一下logout的流程: /** * 用戶註銷
(十二) Java B2B2C o2o多使用者商城 springcloud架構- SSO單點登入之OAuth2.0 登出流程(3)
上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */
Java開發筆記(十二)布林變數論道與或非
在程式語言的設計之初,它們除了可以進行數學計算,還常常用於邏輯推理和條件判斷。為了實現邏輯判斷的功能,Java引入了一種布林型別boolean,用來表示“真”和“假”。該型別的變數只允許兩個取值,即true和false,其中true對應真值,而false對應假值。 如同數值變數擁有加減乘
Java自學筆記(十二)
幾個關鍵字(final/static) final:可以用來修飾類,類的成員,以及區域性變數 注意:final修飾的類不能被繼承,但可以繼承其他類,俗稱“太監類”? final修飾的方法不可
Java NIO系列教程(十二) Java NIO 與 IO
Java NIO系列教程(十二) Java NIO 與 IO 當學習了 Java NIO 和 IO 的 API 後,一個問題馬上湧入腦海: 我應該何時使用 IO,何時使用 NIO 呢?在本文中,我會盡量清晰地解析 Java NIO 和 IO 的差異、它們的使用場景,以及它們如何影響您的程式碼設計。 下表
Java語言學習(十一):列舉型別和泛型
Java中一個重要的型別:列舉,它可以用來表示一組取值範圍固定的變數,使用 enum 關鍵字定義列舉型別,其中元素不能重複,通常大寫表示。利用Java的反射機制,可以在執行時分析類,如檢視列舉型別的修飾符、父類和自定義方法等,下面簡單說下。
Java併發程式設計(十二)CountDownLatch和CyclicBarrier
一、CountDownLatch java.util.concurrent.CountDownLatch可以允許一個或多個執行緒等待其他執行緒操作。從countdown字面意義也可以理解,它是類似於一個倒計時鎖,這個倒計時是原子操作,同一時刻只能有一個執行緒操作倒計時。 CountDownL
Java設計模式(十二)之結構型模式:享元模式
一、定義: 享元模式,也就是說在一個系統中如果有多個相同的物件,那麼只共享一份就可以了,不必每個都去例項化一個物件。比如說一個文本系統,每個字母定一個物件,那麼大小寫字母一共就是52個,那麼就要定義52個物件。如果有一個1M的文字,那麼字母是何其的多,如果每個字母都定義一個
(十二)java springboot b2b2c shop 多使用者商城系統原始碼- SSO單點登入之OAuth2.0 登出流程(3)
上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */
(十二)JAVA springcloud ssm b2b2c多使用者商城系統原始碼-SSO單點登入之OAuth2.0 登出流程(3)
上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */ @R
Java NIO系列教程(十二) Java NIO與IO
作者:Jakob Jenkov 譯者:郭蕾 校對:方騰飛 當學習了Java NIO和IO的API後,一個問題馬上湧入腦海: 我應該何時使用IO,何時使用NIO呢?在本文中,我會盡量清晰地解析Java NIO和IO的差異、它們的使用場景,以及它們如何影響您的程式碼設計。 Java
(十二)java併發程式設計--執行緒優先順序
執行緒的優先順序並不能保證現成的執行次序。只不過,優先順序高的執行緒獲取CPU資源的概率較大,優先順序低的也並不是沒有機會執行。 優先順序用1-10的整數表示,數值越大優先順序越高,預設
java系統學習(十八) --------Applet設計
Applet程式設計是java程式語言中至關重要的獨特功能。它不同於一般的Java程式,其能夠嵌入到HTML網頁中,並由支援Java的Web瀏覽器解釋執行。只有IE瀏覽器3 .0以上的版本,才支援Java Applet程式。通過這種小應用程式。所設計的網頁就能有一定的互