設置JVM的內存分配參數

JVM參數
java

特別說明:jvm

-Xms,堆的初始化大小,在JVM啓動的時候,分配給堆的內存空間大小,java程序在運行的時候,jvm會盡量地將堆大小維持在初始化大小空間內,若是-Xms沒法知足程序所須要的內存空間,則jvm會向操做系統申請更大的內存,直到內存超過了-Xmx,則會報OutOfMemoryError異常。若是-Xms設置的過小,會致使頻繁的minor gc和 full gc,經過gc來釋放無效的堆空間,可是過於頻繁的gc會引發系統的性能問題。
ide

-Xmn用於設置新生代的大小,設置一個較大的新生代大小,就會減小老年代大小,這個參數對系統性能和GC行爲有很大影響,新生代大小通常設置爲堆大小的1/4  --1/3. -Xmn的效果等效於同時設置相同大小的-XX:NewSize和-XX:MaxNewSize,設置不一樣的-XX:NewSize和-XX:MaxNewSize,可能會致使內存震盪。函數

-XX:PermSize是持久代的初始大小,-XX:MaxPermSize是持久代的最大值。持久代大小直接決定了系統支持多少個類定義和常量。性能

系統所支持的最大類數量,與MaxPermSize成正比,通常來講,MaxPermSize設置爲64M能夠知足絕大多數應用程序,若是永久區依然溢出,再設置爲128M,這兩個值是經常使用的永久區取值,若是還溢出的話,那就考慮系統優化設計了,減小動態類的產生或者利用GC回收部分駐紮在永久區的無用類信息。優化

-Xss線程棧,是線程的私有空間,在局部變量分配和函數調用的時候,都須要在棧中開闢空間,若是開闢的棧過小,那麼在線程運行的時候,可能沒有足夠的空間分配局部變量或者達不到足夠的函數調用深度。若是開闢的棧太大,那麼開設線程的內存成本就會增大,致使系統所能支持的線程數量就會減少。spa

因爲java堆也是向操做系統申請內存空間的,若是java堆空間過大的話,則致使操做系統用於線程棧的空間減小,從而間接地致使系統所能支持的線程數量就會減少。操作系統

下面的例子是經過改變線程棧大小和改變堆大小,對線程數的影響。
線程

package com.wangbiao.performance.stack;

/**
 * 
 * @Title: TestThreadStack.java
 * @Package com.wangbiao.performance.stack
 * @Description: TODO 
 * @author wangbiao   
 * @date 2014-10-15 下午2:14:36 
 * @version V1.0
 */
public class TestThreadStack {
    
    public static void main(String[] args) {
        int i = 0;
        try {
        for (i = 0; i < 10000; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            System.out.println(Thread.currentThread().getName());
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
                }
            } catch (OutOfMemoryError e) {
                System.err.println("Current Thread num is "+i);
            }
        
        //  -Xmx100m -Xms100m -Xss50m   Current Thread num is 25
        //  -Xmx100m -Xms100m -Xss60m   Current Thread num is 19
        //  -Xmx100m -Xms100m -Xss70m   Current Thread num is 15
        
        //  -Xmx100m -Xms100m -Xss50m   Current Thread num is 25
        //  -Xmx300m -Xms300m -Xss50m   Current Thread num is 21
        //  -Xmx500m -Xms500m -Xss50m   Current Thread num is 17
    }
}

    -XX:SurvivorRatio新生代中eden和s0或者eden和s1的比例,s0和s1的大小同樣。設計

    -XX:+PrintGCDetails -Xmn100m -XX:SurvivorRatio=8,

    運行結果以下:eden space和from space或者to space的比例是8倍的關係

Heap
  def new generation   total 92160K, used 8332K [0x24230000, 0x2a630000, 0x2a630000)
  eden space 81920K,   9% used [0x24230000, 0x249f6220, 0x29230000)
  from space 10240K,   3% used [0x29230000, 0x2928d090, 0x29c30000)
  to   space 10240K,   0% used [0x29c30000, 0x29c30000, 0x2a630000)

    -XX:NewRatio是老年代和新生代的比例

    -XX:+PrintGCDetails -Xmx20m -Xms20m -XX:NewRatio=2

    運行結果以下:tenured generation和new generation的比例是2倍的關係

Heap
 def new generation   total 6144K, used 5227K [0x32e30000, 0x334d0000, 0x334d0000)
  eden space 5504K,  88% used [0x32e30000, 0x332ef588, 0x33390000)
  from space 640K,  57% used [0x33390000, 0x333eb880, 0x33430000)
  to   space 640K,   0% used [0x33430000, 0x33430000, 0x334d0000)
 tenured generation   total 13696K, used 0K [0x334d0000, 0x34230000, 0x34230000)
   the space 13696K,   0% used [0x334d0000, 0x334d0000, 0x334d0200, 0x34230000)
 compacting perm gen  total 12288K, used 376K [0x34230000, 0x34e30000, 0x38230000)
   the space 12288K,   3% used [0x34230000, 0x3428e130, 0x3428e200, 0x34e30000)
    ro space 10240K,  54% used [0x38230000, 0x387adaf0, 0x387adc00, 0x38c30000)
    rw space 12288K,  55% used [0x38c30000, 0x392d1ce8, 0x392d1e00, 0x39830000)

    

相關文章
相關標籤/搜索