欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM之參數(shù)分配(全面講解)

 更新時間:2017年05月30日 09:34:48   投稿:jingxian  
下面小編就為大家?guī)硪黄狫VM之參數(shù)分配(全面講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、堆參數(shù)設(shè)置

-XX:+PrintGC 使用這個參數(shù),虛擬機啟動后,只要遇到GC就會打印日志

-XX:+UseSerialGC 配置串行回收器

-XX:+PrintGCDetails 可以查看詳細信息,包括各個區(qū)的情況

-Xms:設(shè)置Java程序啟動時初始化堆大小

-Xmx:設(shè)置Java程序能獲得最大的堆大小

-Xmx20m -Xms5m -XX:+PrintCommandLineFlags:可以將隱式或者顯示傳給虛擬機的參數(shù)輸出

在實際工作中,我們可以直接將初始的堆大小與最大堆大小設(shè)置相等,這樣的好處是可以減少程序運行時的垃圾回收次數(shù),從而提高性能。

配置運行時參數(shù):-XX:+PrintGC -Xms5m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintCommandLineFlags

運行一下Demo:

package com.ietree.basicskill.jvm;

public class Demo01 {
  public static void main(String[] args) {
    
    // -XX:+PrintGC -Xms5m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintCommandLineFlags
    
    //查看GC信息
    System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
    System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
    System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
    
    byte[] b1 = new byte[1*1024*1024];
    System.out.println("分配了1M");
    System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
    System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
    System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
    
    byte[] b2 = new byte[4*1024*1024];
    System.out.println("分配了4M");
    System.out.println("max memory:" + Runtime.getRuntime().maxMemory());
    System.out.println("free memory:" + Runtime.getRuntime().freeMemory());
    System.out.println("total memory:" + Runtime.getRuntime().totalMemory());
    
  }
}

程序輸出:

-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC 
max memory:20316160
free memory:5286032
total memory:6094848
[GC (Allocation Failure) [DefNew: 789K->191K(1856K), 0.0026441 secs] 789K->530K(5952K), 0.0027627 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
分配了1M
max memory:20316160
free memory:4469352
total memory:6094848
[GC (Allocation Failure) [DefNew: 1249K->0K(1856K), 0.0022285 secs][Tenured: 1554K->1554K(4096K), 0.0031394 secs] 1587K->1554K(5952K), [Metaspace: 2597K->2597K(1056768K)], 0.0054980 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
分配了4M
max memory:20316160
free memory:4538184
total memory:10358784
Heap
 def new generation  total 1920K, used 68K [0x00000000fec00000, 0x00000000fee10000, 0x00000000ff2a0000)
 eden space 1728K,  3% used [0x00000000fec00000, 0x00000000fec113e0, 0x00000000fedb0000)
 from space 192K,  0% used [0x00000000fedb0000, 0x00000000fedb0000, 0x00000000fede0000)
 to  space 192K,  0% used [0x00000000fede0000, 0x00000000fede0000, 0x00000000fee10000)
 tenured generation  total 8196K, used 5650K [0x00000000ff2a0000, 0x00000000ffaa1000, 0x0000000100000000)
  the space 8196K, 68% used [0x00000000ff2a0000, 0x00000000ff824888, 0x00000000ff824a00, 0x00000000ffaa1000)
 Metaspace    used 2603K, capacity 4486K, committed 4864K, reserved 1056768K
 class space  used 288K, capacity 386K, committed 512K, reserved 1048576K

在此程序輸出的結(jié)果中,可以看到堆的詳細信息,比如可以看到它的新生代信息、老年代信息、永久區(qū)信息等。

二、新生代參數(shù)配置

-Xmn:可以設(shè)置新生代的大小,設(shè)置一個比較大的新生代會減少老年代的大小,這個參數(shù)對系統(tǒng)性能以及GC行為有很大的影響,新生代大小一般會設(shè)置整個堆空間的1/3到1/4左右。

-XX:SurvivorRatio:用來設(shè)置新生代中eden空間和from/to空間的比例。含義:-XX:SurvivorRatio=eden/from=eden/to。
不同的堆分布情況,對系統(tǒng)執(zhí)行會產(chǎn)生一定的影響,在實際工作中,應(yīng)該根據(jù)系統(tǒng)的特點做出合理的配置,基本策略:盡可能將對象預(yù)留在新生代,減少老年代的GC次數(shù)。

除了可以設(shè)置新生代的絕對大?。?Xmn),還可以使用(-XX:NewRatio)設(shè)置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。

配置運行時參數(shù):

-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
-XX:+UseSerialGC

運行Demo:

package com.ietree.basicskill.jvm;

public class Demo2 {
  public static void main(String[] args) {

    // 第一次配置(eden 2 = from 1 + to 1)
    // -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

    // 第二次配置
    // -Xms20m -Xmx20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

    // 第三次配置
    // -XX:NewRatio=老年代/新生代
    // -Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

    byte[] b = null;
    // 連續(xù)向系統(tǒng)申請10MB空間
    for (int i = 0; i < 10; i++) {
      b = new byte[1 * 1024 * 1024];
    }
  }
}

程序運行結(jié)果:

[GC (Allocation Failure) [DefNew: 508K->256K(768K), 0.0012770 secs] 508K->435K(20224K), 0.0013333 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation  total 768K, used 498K [0x00000000fec00000, 0x00000000fed00000, 0x00000000fed00000)
 eden space 512K, 47% used [0x00000000fec00000, 0x00000000fec3c988, 0x00000000fec80000)
 from space 256K, 100% used [0x00000000fecc0000, 0x00000000fed00000, 0x00000000fed00000)
 to  space 256K,  0% used [0x00000000fec80000, 0x00000000fec80000, 0x00000000fecc0000)
 tenured generation  total 19456K, used 10419K [0x00000000fed00000, 0x0000000100000000, 0x0000000100000000)
  the space 19456K, 53% used [0x00000000fed00000, 0x00000000ff72cf20, 0x00000000ff72d000, 0x0000000100000000)
 Metaspace    used 2601K, capacity 4486K, committed 4864K, reserved 1056768K
 class space  used 288K, capacity 386K, committed 512K, reserved 1048576K

可以看到,在新生代種,eden區(qū)域內(nèi)存是from和to區(qū)域內(nèi)存的2倍。即-XX:SurvivorRatio=2參數(shù)起了作用。

配置運行參數(shù):-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

運行以上Demo可以得到一下輸出:

[GC (Allocation Failure) [DefNew: 4979K->529K(6144K), 0.0028804 secs] 4979K->1553K(19840K), 0.0029572 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [DefNew: 5756K->0K(6144K), 0.0021035 secs] 6780K->2576K(19840K), 0.0021487 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation  total 6144K, used 1134K [0x00000000fec00000, 0x00000000ff2a0000, 0x00000000ff2a0000)
 eden space 5504K, 20% used [0x00000000fec00000, 0x00000000fed1b9d8, 0x00000000ff160000)
 from space 640K,  0% used [0x00000000ff160000, 0x00000000ff160000, 0x00000000ff200000)
 to  space 640K,  0% used [0x00000000ff200000, 0x00000000ff200000, 0x00000000ff2a0000)
 tenured generation  total 13696K, used 2576K [0x00000000ff2a0000, 0x0000000100000000, 0x0000000100000000)
  the space 13696K, 18% used [0x00000000ff2a0000, 0x00000000ff524140, 0x00000000ff524200, 0x0000000100000000)
 Metaspace    used 2601K, capacity 4486K, committed 4864K, reserved 1056768K
 class space  used 288K, capacity 386K, committed 512K, reserved 1048576K

發(fā)現(xiàn)tenured generation老年代的內(nèi)存是new generation 新生代內(nèi)存的2倍。

三、堆溢出參數(shù)配置

在Java程序的運行過程中,如果對空間不足,則會拋出內(nèi)存溢出的錯誤(Out Of Memory)OOM,一旦這類問題發(fā)生在生產(chǎn)環(huán)境,則可能引起嚴重的業(yè)務(wù)中斷,Java虛擬機提供了-XX:+HeapDumpOnOutOfMemoryError,
使用該參數(shù)可以在內(nèi)存溢出時導(dǎo)出整個堆信息,與之配合使用的還有參數(shù)-XX:HeapDumpPath,可以設(shè)置導(dǎo)出堆的存放路徑。
內(nèi)存分析工具:Memory Analyzer

配置運行時參數(shù)-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Demo3.dump

運行Demo:

package com.ietree.basicskill.jvm;

import java.util.Vector;

public class Demo3 {
  public static void main(String[] args) {
    // -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Demo3.dump
    // 堆內(nèi)存溢出
    Vector v = new Vector();
    for (int i = 0; i < 5; i++) {
      v.add(new Byte[1 * 1024 * 1024]);
    }
  }
}

程序輸出的結(jié)果:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to d:/Demo3.dump ...
Heap dump file created [1219372 bytes in 0.009 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  at com.ietree.basicskill.jvm.Demo3.main(Demo3.java:11)

在d:/Demo3.dump可以找到對應(yīng)的文件,使用內(nèi)存分析工具(Memory analyzer)打開:

如圖:

四、棧參數(shù)配置

Java虛擬機提供了參數(shù)-Xss來指定線程的最大棧空間,整個參數(shù)也直接決定了函數(shù)可調(diào)用的最大深度。

配置運行時參數(shù):-Xss1m

運行Demo:

package com.ietree.basicskill.jvm;

public class Demo4 {
  // -Xss1m
  // -Xss5m

  // 棧調(diào)用深度
  private static int count;

  public static void recursion() {
    count++;
    recursion();
  }

  public static void main(String[] args) {
    try {
      recursion();
    } catch (Throwable t) {
      System.out.println("調(diào)用最大深入:" + count);
      t.printStackTrace();
    }
  }
}

程序輸出:

調(diào)用最大深入:20557
java.lang.StackOverflowError
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  at com.ietree.basicskill.jvm.Demo4.recursion(Demo4.java:12)
  ......

五、方法區(qū)參數(shù)配置

和Java堆一樣,方法區(qū)是一塊所有線程共享的內(nèi)存區(qū)域,它用于保存系統(tǒng)的類信息,方法區(qū)(永久區(qū))可以保存多少信息可以對其進行配置,在默認情況下,-XX:MaxPermSize為64M,
如果系統(tǒng)運行時生產(chǎn)大量的類,就需要設(shè)置一個相對合適的方法區(qū),以免出現(xiàn)永久區(qū)內(nèi)存溢出的問題。

-XX:PermSize=64M -XX:MaxPermSize=64M

六、直接內(nèi)存參數(shù)配置

直接內(nèi)存也是Java程序中非常重要的組成部分,特別是廣泛用在NIO中,直接內(nèi)存跳過了Java堆,使用Java程序可以直接訪問原生堆空間,因此在一定程度上加快了內(nèi)存空間的訪問速度。

但是說直接內(nèi)存一定就可以提高內(nèi)存訪問速度也不見得,具體情況具體分析。

相關(guān)配置參數(shù):-XX:MaxDirectMemorySize,如果不設(shè)置,默認值為最大堆空間,即-Xmx。直接內(nèi)存使用達到上限時,就會觸發(fā)垃圾回收,如果不能有效的釋放空間,就會引起系統(tǒng)的OOM。

七、對象進入老年代的參數(shù)配置

一般而言,對象首次創(chuàng)建會被放置在新生代的eden區(qū),如果沒有GC介入,則對象不會離開eden區(qū),那么eden區(qū)的對象如何進入老年代呢?

通常情況下,只要對象的年齡達到一定的大小,就會自動離開年輕代進入老年代,對象年齡是由對象經(jīng)歷數(shù)次GC決定的,在新生代每次GC之后如果對象沒有被回收,則年齡加1。

虛擬機提供了一個參數(shù)來控制新生代對象的最大年齡,當超過這個年齡范圍就會晉升老年代。

-XX:MaxTenuringThreshold,默認情況下為15

配置運行時參數(shù):-Xmx64M -Xms64M -XX:+PrintGCDetails

運行Demo:

package com.ietree.basicskill.jvm;

public class Demo5 {
  public static void main(String[] args) {
    // 初始的對象在eden區(qū)
    // 參數(shù):-Xmx64M -Xms64M -XX:+PrintGCDetails
    for (int i = 0; i < 5; i++) {
      byte[] b = new byte[1024 * 1024];
    }

  }
}

程序輸出:

Heap
 PSYoungGen   total 18944K, used 6759K [0x00000000feb00000, 0x0000000100000000, 0x0000000100000000)
 eden space 16384K, 41% used [0x00000000feb00000,0x00000000ff199db8,0x00000000ffb00000)
 from space 2560K, 0% used [0x00000000ffd80000,0x00000000ffd80000,0x0000000100000000)
 to  space 2560K, 0% used [0x00000000ffb00000,0x00000000ffb00000,0x00000000ffd80000)
 ParOldGen    total 44032K, used 0K [0x00000000fc000000, 0x00000000feb00000, 0x00000000feb00000)
 object space 44032K, 0% used [0x00000000fc000000,0x00000000fc000000,0x00000000feb00000)
 Metaspace    used 2601K, capacity 4486K, committed 4864K, reserved 1056768K
 class space  used 288K, capacity 386K, committed 512K, reserved 1048576K

結(jié)論:對象首次創(chuàng)建會被放置在新生代的eden區(qū),因此輸出結(jié)果中from和to區(qū)都為0%。

根據(jù)設(shè)置MaxTenuringThreshold參數(shù),可以指定新生代對象經(jīng)過多少次回收后進入老年代。另外,大對象新生代eden區(qū)無法裝入時,也會直接進入老年代。

JVM里有個參數(shù)可以設(shè)置對象的大小超過在指定的大小之后,直接晉升老年代。
-XX:PretenureSizeThreshold=15

參數(shù):-Xmx1024M -Xms1024M -XX:+UseSerialGC -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails

使用PretenureSizeThreshold可以進行指定進入老年代的對象大小,但是要注意TLAB區(qū)域優(yōu)先分配空間。虛擬機對于體積不大的對象 會優(yōu)先把數(shù)據(jù)分配到TLAB區(qū)域中,因此就失去了在老年代分配的機會.

參數(shù):-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:-UseTLAB

八、TLAB參數(shù)配置

TLAB全稱是Thread Local Allocation Buffer即線程本地分配緩存,從名字上看是一個線程專用的內(nèi)存分配區(qū)域,是為了加速對象分配對象而生的。

每一個線程都會產(chǎn)生一個TLAB,該線程獨享的工作區(qū)域,Java虛擬機使用這種TLAB區(qū)來避免多線程沖突問題,提高了對象分配的效率。

TLAB空間一般不會太大,當大對象無法在TLAB分配時,則會直接分配到堆上。

-XX:+UseTLAB使用TLAB

-XX:+TLABSize設(shè)置TLAB大小

-XX:TLABRefillWasteFraction設(shè)置維護進入TLAB空間的單個對象大小,它是一個比例值,默認為64,即如果對象大于整個空間的1/64,則在堆創(chuàng)建對象。

-XX:+PrintTLAB查看TLAB信息

-XX:ResizeTLAB自調(diào)整TLABRefillWasteFraction閾值。

參數(shù):-XX:+UseTLAB -XX:+PrintTLAB -XX:+PrintGC -XX:TLABSize=102400 -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=100 -XX:-DoEscapeAnalysis -server

以上這篇JVM之參數(shù)分配(全面講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java IO之字節(jié)輸入輸出流詳解

    Java IO之字節(jié)輸入輸出流詳解

    這篇文章主要為大家介紹了Java IO之字節(jié)輸入輸出流,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • java多線程入門知識及示例程序

    java多線程入門知識及示例程序

    java多線程入門知識及示例程序,大家參考使用吧
    2013-12-12
  • java實現(xiàn)簡單控制臺通訊錄

    java實現(xiàn)簡單控制臺通訊錄

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單控制臺通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot兩種方式刷新配置信息

    SpringBoot兩種方式刷新配置信息

    這篇文章主要介紹了SpringBoot兩種方式刷新配置信息,一種是@?ConfigurationProperties?不能自動刷新,需要手動調(diào)用contextRefresher.refresh()方法來刷新配置,第二種方法可以嘗試下,需要的朋友可以參考下
    2023-08-08
  • 如何利用NetworkInterface獲取服務(wù)器MAC地址

    如何利用NetworkInterface獲取服務(wù)器MAC地址

    今天介紹一種通用的跨平臺的操作方式,那就是JDK自帶的NetworkInterface接口,該接口在JDK1.4已經(jīng)出現(xiàn),但是功能比較少,JDK1.6之后新增了不少新功能,比較不錯
    2013-08-08
  • Java HttpClient實現(xiàn)socks代理的示例代碼

    Java HttpClient實現(xiàn)socks代理的示例代碼

    這篇文章主要介紹了Java HttpClient 實現(xiàn) socks 代理的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Springboot通過ObjectMapper配置json序列化詳解

    Springboot通過ObjectMapper配置json序列化詳解

    SpringBoot默認集成Jackson庫,其中ObjectMapper類是核心,用于Java對象與JSON字符串的互轉(zhuǎn),提供配置序列化特性、注冊模塊等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、將Long轉(zhuǎn)為字符串,還可以配置序列化時的各種規(guī)則,感興趣的可以了解一下
    2024-10-10
  • Spring Boot使用Value注解給靜態(tài)變量賦值的方法

    Spring Boot使用Value注解給靜態(tài)變量賦值的方法

    這篇文章主要介紹了Spring Boot使用Value注解給靜態(tài)變量賦值的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java調(diào)用C++程序的實現(xiàn)方式

    Java調(diào)用C++程序的實現(xiàn)方式

    這篇文章主要介紹了Java調(diào)用C++程序的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • IDEA自動生成類圖和時序圖的操作指南

    IDEA自動生成類圖和時序圖的操作指南

    idea 的強大之處在于此,它包含了很多小插件,我們不需要再次下載相關(guān)插件,只需要在idea中小小的設(shè)置一下就可以了,本文我介紹了IDEA自動生成類圖和時序圖的操作指南,我用的是idea2020版本,需要的朋友可以參考下
    2024-05-05

最新評論