一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - JVM之參數(shù)分配(全面講解)

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

2020-11-02 17:38Java之家 JAVA教程

下面小編就為大家?guī)?lái)一篇JVM之參數(shù)分配(全面講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

-xx:+printgc 使用這個(gè)參數(shù),虛擬機(jī)啟動(dòng)后,只要遇到gc就會(huì)打印日志

-xx:+useserialgc 配置串行回收器

-xx:+printgcdetails 可以查看詳細(xì)信息,包括各個(gè)區(qū)的情況

-xms:設(shè)置java程序啟動(dòng)時(shí)初始化堆大小

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

-xmx20m -xms5m -xx:+printcommandlineflags:可以將隱式或者顯示傳給虛擬機(jī)的參數(shù)輸出

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

配置運(yùn)行時(shí)參數(shù):-xx:+printgc -xms5m -xmx20m -xx:+useserialgc -xx:+printgcdetails -xx:+printcommandlineflags

運(yùn)行一下demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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());
    
  }
}

程序輸出:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-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é)果中,可以看到堆的詳細(xì)信息,比如可以看到它的新生代信息、老年代信息、永久區(qū)信息等。

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

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

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

除了可以設(shè)置新生代的絕對(duì)大小(-xmn),還可以使用(-xx:newratio)設(shè)置新生代和老年代的比例:-xx:newratio=老年代/新生代。

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

-xms20m -xmx20m -xmn1m -xx:survivorratio=2 -xx:+printgcdetails
-xx:+useserialgc

運(yùn)行demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)申請(qǐng)10mb空間
    for (int i = 0; i < 10; i++) {
      b = new byte[1 * 1024 * 1024];
    }
  }
}

程序運(yùn)行結(jié)果:

?
1
2
3
4
5
6
7
8
9
10
[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ù)起了作用。

配置運(yùn)行參數(shù):-xms20m -xmx20m -xx:newratio=2 -xx:+printgcdetails -xx:+useserialgc

運(yùn)行以上demo可以得到一下輸出:

?
1
2
3
4
5
6
7
8
9
10
11
[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程序的運(yùn)行過(guò)程中,如果對(duì)空間不足,則會(huì)拋出內(nèi)存溢出的錯(cuò)誤(out of memory)oom,一旦這類(lèi)問(wèn)題發(fā)生在生產(chǎn)環(huán)境,則可能引起嚴(yán)重的業(yè)務(wù)中斷,java虛擬機(jī)提供了-xx:+heapdumponoutofmemoryerror,
使用該參數(shù)可以在內(nèi)存溢出時(shí)導(dǎo)出整個(gè)堆信息,與之配合使用的還有參數(shù)-xx:heapdumppath,可以設(shè)置導(dǎo)出堆的存放路徑。
內(nèi)存分析工具:memory analyzer

配置運(yùn)行時(shí)參數(shù)-xms1m -xmx1m -xx:+heapdumponoutofmemoryerror -xx:heapdumppath=d:/demo3.dump

運(yùn)行demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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é)果:

?
1
2
3
4
5
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可以找到對(duì)應(yīng)的文件,使用內(nèi)存分析工具(memory analyzer)打開(kāi):

如圖:

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

四、棧參數(shù)配置

java虛擬機(jī)提供了參數(shù)-xss來(lái)指定線程的最大棧空間,整個(gè)參數(shù)也直接決定了函數(shù)可調(diào)用的最大深度。

配置運(yùn)行時(shí)參數(shù):-xss1m

運(yùn)行demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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();
    }
  }
}

程序輸出:

?
1
2
3
4
5
6
7
8
9
10
11
調(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)的類(lèi)信息,方法區(qū)(永久區(qū))可以保存多少信息可以對(duì)其進(jìn)行配置,在默認(rèn)情況下,-xx:maxpermsize為64m,
如果系統(tǒng)運(yùn)行時(shí)生產(chǎn)大量的類(lèi),就需要設(shè)置一個(gè)相對(duì)合適的方法區(qū),以免出現(xiàn)永久區(qū)內(nèi)存溢出的問(wèn)題。

-xx:permsize=64m -xx:maxpermsize=64m

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

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

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

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

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

一般而言,對(duì)象首次創(chuàng)建會(huì)被放置在新生代的eden區(qū),如果沒(méi)有g(shù)c介入,則對(duì)象不會(huì)離開(kāi)eden區(qū),那么eden區(qū)的對(duì)象如何進(jìn)入老年代呢?

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

虛擬機(jī)提供了一個(gè)參數(shù)來(lái)控制新生代對(duì)象的最大年齡,當(dāng)超過(guò)這個(gè)年齡范圍就會(huì)晉升老年代。

-xx:maxtenuringthreshold,默認(rèn)情況下為15

配置運(yùn)行時(shí)參數(shù):-xmx64m -xms64m -xx:+printgcdetails

運(yùn)行demo:

?
1
2
3
4
5
6
7
8
9
10
11
12
package com.ietree.basicskill.jvm;
 
public class demo5 {
  public static void main(string[] args) {
    // 初始的對(duì)象在eden區(qū)
    // 參數(shù):-xmx64m -xms64m -xx:+printgcdetails
    for (int i = 0; i < 5; i++) {
      byte[] b = new byte[1024 * 1024];
    }
 
  }
}

程序輸出:

?
1
2
3
4
5
6
7
8
9
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é)論:對(duì)象首次創(chuàng)建會(huì)被放置在新生代的eden區(qū),因此輸出結(jié)果中from和to區(qū)都為0%。

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

jvm里有個(gè)參數(shù)可以設(shè)置對(duì)象的大小超過(guò)在指定的大小之后,直接晉升老年代。
-xx:pretenuresizethreshold=15

參數(shù):-xmx1024m -xms1024m -xx:+useserialgc -xx:maxtenuringthreshold=15 -xx:+printgcdetails

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

參數(shù):-xmx30m -xms30m -xx:+useserialgc -xx:+printgcdetails -xx:pretenuresizethreshold=1000 -xx:-usetlab

八、tlab參數(shù)配置

tlab全稱(chēng)是thread local allocation buffer即線程本地分配緩存,從名字上看是一個(gè)線程專(zhuān)用的內(nèi)存分配區(qū)域,是為了加速對(duì)象分配對(duì)象而生的。

每一個(gè)線程都會(huì)產(chǎn)生一個(gè)tlab,該線程獨(dú)享的工作區(qū)域,java虛擬機(jī)使用這種tlab區(qū)來(lái)避免多線程沖突問(wèn)題,提高了對(duì)象分配的效率。

tlab空間一般不會(huì)太大,當(dāng)大對(duì)象無(wú)法在tlab分配時(shí),則會(huì)直接分配到堆上。

-xx:+usetlab使用tlab

-xx:+tlabsize設(shè)置tlab大小

-xx:tlabrefillwastefraction設(shè)置維護(hù)進(jìn)入tlab空間的單個(gè)對(duì)象大小,它是一個(gè)比例值,默認(rèn)為64,即如果對(duì)象大于整個(gè)空間的1/64,則在堆創(chuàng)建對(duì)象。

-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ù)分配(全面講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲狼人香蕉香蕉在线28 | www.爱情岛论坛 | 日韩欧美三级视频 | 韩国最新三级网站在线播放 | juliaann丝袜精品系列 | 午夜宅男网 | 猫咪社区免费资源在线观看 | 四虎精品成人免费影视 | 午夜看片a福利在线观看 | 精品一区heyzo在线播放 | 女主被男主为催奶药h | 黑人又大又硬又粗再深一点 | 亚洲成人网页 | 日本h乱淫动漫在线观看 | 三级欧美在线 | 日韩影院在线观看 | 性福演算法| 日本私人影院 | fuqer日本老师 | 沉沦艳妇杨幂肉体小说 | 久草在线福利资站免费视频 | 99久久成人 | 99久久久久国产 | 我们日本在线观看免费动漫下载 | 国产成人手机在线好好热 | 日产乱码2021永久手机版 | 亚洲午夜性春猛交xxxx | 欧美视频精品一区二区三区 | 舔小说| 美女扒开胸罩露出奶了无遮挡免费 | 石原莉奈被店长侵犯免费 | 国产三级自拍 | 午夜影院免费体验 | 精品免费视在线观看 | 手机免费在线视频 | 国产精品久线观看视频 | 特大黑人娇小亚洲女mp4 | 久久国产乱子伦精品免费不卡 | v视界影院成片 | 污影院 | 日本在线观看www免费 |