设置JVM的内存分配参数

JVM参数

115033_EOjv_617909.png

特别说明:

-Xms,堆的初始化大小,在JVM启动的时候,分配给堆的内存空间大小,java程序在运行的时候,jvm会尽可能地将堆大小维持在初始化大小空间内,如果-Xms无法满足程序所需要的内存空间,则jvm会向操作系统申请更大的内存,直到内存超过了-Xmx,则会报OutOfMemoryError异常。如果-Xms设置的太小,会导致频繁的minor gc和 full gc,通过gc来释放无效的堆空间,但是过于频繁的gc会引起系统的性能问题。

-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线程栈,是线程的私有空间,在局部变量分配和函数调用的时候,都需要在栈中开辟空间,如果开辟的栈太小,那么在线程运行的时候,可能没有足够的空间分配局部变量或者达不到足够的函数调用深度。如果开辟的栈太大,那么开设线程的内存成本就会增大,导致系统所能支持的线程数量就会减小。

由于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)

    151029_o7qZ_617909.png




转载于:https://my.oschina.net/u/617909/blog/331805

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值