1. 程式人生 > >Java架構學習(十二)java記憶體結構&新生代&老年代&JVM引數調優&堆記憶體引數配置&解決堆疊溢位

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程式。通過這種小應用程式。所設計的網頁就能有一定的互