JVM 堆参数调优

Posted yufeng218

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM 堆参数调优 相关的知识,希望对你有一定的参考价值。

 堆参数调优

1、堆的结构

 JAVA7 

  堆逻辑上分为:新生区、养老区、永久区;实际上堆只有新生区、养老区

   Minor GC:轻量的垃圾回收;   Major GC(Full GC):重量级垃圾回收。

  技术分享图片

 

Java8 

  没有永久区了,被元空间取代;

  技术分享图片

 

 2、堆内存调优

  -Xms:设置初始分配大小,默认为物理内存的 “ 1 / 64”;

  -Xmx:最大分配内存,默认为物理内存的 “1 / 4”;

  -XX:+PrintGCDetails:输出详细的GC处理日志;

 (1)使用代码输出实际默认的内存,代码如下:

public class Demo1
{
    public static void main(String[] args)
    {
        long totalMemory = Runtime.getRuntime().totalMemory(); //JVM中的初始内存总量
        long maxMemory = Runtime.getRuntime().maxMemory(); //JVM试图使用的最大内存

        System.out.println("totalMemory = " + totalMemory + "Byte 、 " +
                (totalMemory / (double) 1024 / 1024) + " MB");
        System.out.println("MaxMemory = " + maxMemory + " Byte 、 " +
                (maxMemory / (double) 1024 / 1024) + " MB");
    }
}

  结果如下:(物理内存:12G

  totalMemory = 191365120Byte 、 182.5 MB        // 182.5 * 64 / 1024

  MaxMemory = 2831679488 Byte 、 2700.5 MB   // 2700.5 * 4 / 1024  

     结论:发现默认的情况下分配的内存是总内存的 “1 / 4”、而初始化内存为 “1 / 64”。

 

(2)在IDEA中设置VM参数:

  VM 参数: -Xms1024M -Xmx1024M -XX:+PrintGCDetails

技术分享图片

技术分享图片

 运行结果: 

  totalMemory = 1029177344Byte 、 981.5 MB   //1024M

  MaxMemory = 1029177344 Byte 、 981.5 MB

  Heap

  PSYoungGen      total 305664K, used 20971K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)

    eden space 262144K, 8% used [0x00000000eab00000,0x00000000ebf7afb8,0x00000000fab00000)

    from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)

    to   space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)

   ParOldGen       total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)

    object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)

   Metaspace       used 3516K, capacity 4500K, committed 4864K, reserved 1056768K

 

    class space    used 389K, capacity 392K, committed 512K, reserved 1048576K

        计算堆内存: (305664 + 699392)/ 1024 = 981.5 MB

 

 3、MMO异常的代码:

为了更快的产生OOM,设置如下参数; 

        VM 参数: -Xms8M -Xmx8M -XX:+PrintGCDetails 

public class Demo2
{
    public static void main(String[] args)
    {
        String str = "hello world";
        while(true)
        {
            str += str + new Random().nextInt(88888888)
                    + new Random().nextInt(999999999);
        }
    }
}

 

public class Demo1
{
public static void main(String[] args)
{
long totalMemory = Runtime.getRuntime().totalMemory(); //JVM中的初始内存总量
long maxMemory = Runtime.getRuntime().maxMemory(); //JVM试图使用的最大内存

System.out.println("totalMemory = " + totalMemory + "Byte " +
(totalMemory / (double) 1024 / 1024) + " MB");
System.out.println("MaxMemory = " + maxMemory + " Byte " +
(maxMemory / (double) 1024 / 1024) + " MB");
}
}













以上是关于JVM 堆参数调优 的主要内容,如果未能解决你的问题,请参考以下文章

JVM参数调优详解

性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

JVM调优参数整理

jvm内存调优参数详解,附RocketMQ默认内存调优设置

JVM调优常用参数配置

JVM性能分析和调优方向