jvm参数设置

1、Trace跟踪参数  

    1.1 关于GC的参数配置

            -XX:+printGC    打印GC的简要信息

            -XX:+PrintGCDetails    打印GC的详细信息

            -XX:+PrintGCTimeStamps    打印CG发生的时间戳

            -Xloggc:log/gc.log    指定GC log的位置

            -XX:+PrintHeapAtGC    每一次GC前和GC后,都打印堆信息。

    1.2 关于GC日志的解释           

        [GC[DefNew: 4416K->0K(4928K), 0.0001897secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]

            上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。       

            上图中,我们先看一下用红框标注的“[0x27e80000, 0x28d80000, 0x28d80000)”的含义,它表示新生代在内存当中的位置:第一个参数是申请到的起始位置,第二个参数是申请到的终点位置,第三个参数表示最多能申请到的位置。上图中的例子表示新生代申请到了15M的控件,而这个15M是等于:(eden space的12288K)+(from space的1536K)+(to space的1536K)。

2、关于java堆的参数设置

    2.1 关于java堆的参数配置

        -Xmx –Xms    指定最大堆和初始堆

        -Xmn     设置新生代大小

        -XX:NewRatio       老年代(不包含永久区)和新生代(eden+2*s)的比值

        -XX:SurvivorRatio(幸存代) eden区和Survivor的比值

            SurvivorRatio的默认值为8,言外之意就是Edon和Survivor的比例是8:1:1。

        不同的堆分布情况,对系统执行会产生一定的影响,基本策略:尽可能将对象预留在新生代减少老年代的GC次数

    2.2 关于堆溢出的处理参数配置

        -XX:+HeapDumpOnOutOfMemoryError         OOM(堆溢出)时导出整个堆信息到文件根据这个文件,我们可以看到系统dump时发生了什么。

        -XX:+HeapDumpPath       可以设置导出堆信息的路径

3、关于方法区的参数设置

    -XX:PermSize    设置永久区的初始空间

     -XX:MaxPermSize  设置永久区的最大空间。

    也就是说,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM(内存溢出)。

    如果堆空间没有用完也抛出了OOM,有可能是永久区导致的。堆空间实际占用非常少,但是永久区溢出一样抛出OOM。

4、关于java栈的参数设置

    -Xss  设置栈空间的大小。通常只有几百K

  决定了函数调用的深度

  每个线程都有独立的栈空间

  局部变量、参数分配在栈上

5、JVM Server模式与client模式

    5.1 JVM Server模式与client模式

        我们的jdk完成安装后,在命名行输入java -version不仅可以看到jdk版本相关信息,还会看到类似与 Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) 这样的信息。其中有个Server VM (build 25.31-b07, mixed mode)其实代表了JVM的Server模式了。当然JVM还有一个Client模式。

    5.2 JVM Server模式与client模式启动的差别?

    最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器. C2比C1编译器编译的相对彻底,服务起来之后,性能更高.所以通常用于做服务器的时候我们用服务端模式,如果你的电脑只是运行一下java程序,就客户端模式就可以了。即使服务器模式编译更彻底,垃圾回收优化更好,这当然吃的内存要多点相对于客户端模式。

猜你喜欢

转载自blog.csdn.net/strong997/article/details/80032498