美文网首页
浅谈JVM堆内存空间调整

浅谈JVM堆内存空间调整

作者: P_ursuit | 来源:发表于2018-04-04 12:54 被阅读0次

    ​ 实际上每一块自内存区中都会有存在一部分的可变伸缩区,其基本流程:如果空间不足了,则在可变的范围之内扩大内存空间,当一段时间之后发现内存空间没有那么紧张的时候,再将可变空间进行释放。

    1、堆内存空间调整参数表
    No. 参数名称 描述
    01 -Xms 设置初始分配大小,默认为物理内存的"1/64"
    02 -Xmx 最大分配内存,默认为物理内存的"1/4"
    03 -XX:+PrintGCDetails 输出详细的GC处理日志
    04 -XX:+PrintGCTimeStamps 输出GC的时间戳信息
    05 -XX:+PrintGCDateStamps 输出GC时间戳信息(以日期的形式,如2018-04-04T16:53:16.155+0800:)
    06 -XX:+PrintHeapAtGC 在GC进行处理的前后打印堆内存信息
    07 -Xloggc:保存路径 设置日志信息保存文件

    ​ 在整个堆内存的调整策略之中,有经验的人基本上都只会调整两个参数:"-Xmx"(最大内存)、"-Xms"(初始化内存)。
    ​ 如果要想取得这些内存的整体信息直接利用Runtime类即可

    package demo;
    
    /**
     * Created by  on 2018/4/4.
     */
    public class TestDemo {
    
        public static void main(String[] args){
            Runtime runtime = Runtime.getRuntime();
            long maxMemory = runtime.maxMemory(); // 最大内存
            long totalMemory = runtime.totalMemory(); // 默认使用总内存
            System.out.println("最大内存数:"+maxMemory+"字节、"+(maxMemory/(double)1024/1024)+"MB");
            System.out.println("默认使用总内存:"+totalMemory+"字节、"+(totalMemory/(double)1024/1024)+"MB");
        }
    }
    
    • 根据本机内存大小不同而定

    最大内存数:1908932608字节、1820.5MB
    使用总内存:128974848字节、123.0MB

    发现默认的情况下分配的内存是总内存的"1/4"、而初始化的内存为"1/64";那么也就是说整个内存空间的可变范围(伸缩区):123.0MB~1820.5MB之间,那么现在就可能造成程序的性能下降。

    java -Xmx2G -Xms2G TestDemo
    

    那么这个时候要避免伸缩区的可调策略,在执行程序时添加如下命令,将初始大小内存与最大可用内存大小设置为一致,从而提升整个程序的性能。

    • 范例:观察GC详细日志
    java -Xmx2G -Xms2G -XX:+PrintGCDetails TestDemo
    

    最大内存数:2058354688字节、1963.0MB
    默认使用总内存:2058354688字节、1963.0MB
    Heap
    PSYoungGen total 611840K, used 41984K [0x0000000795580000, 0x00000007c0000000, 0x00000007c0000000)
    eden space 524800K, 8% used [0x0000000795580000,0x0000000797e801b8,0x00000007b5600000)
    from space 87040K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007c0000000)
    to space 87040K, 0% used [0x00000007b5600000,0x00000007b5600000,0x00000007bab00000)
    ParOldGen total 1398272K, used 0K [0x0000000740000000, 0x0000000795580000, 0x0000000795580000)
    object space 1398272K, 0% used [0x0000000740000000,0x0000000740000000,0x0000000795580000)
    Metaspace used 2774K, capacity 4486K, committed 4864K, reserved 1056768K
    class space used 295K, capacity 386K, committed 512K, reserved 1048576K

    ​ 下面再编写一个代码,观察GC的触发操作。

    • 范例:测试GC处理
    package demo;
    
    import java.util.Random;
    
    /**
     * Created by on 2018/4/4.
     */
    public class TestDemo {
    
        public static void main(String[] args){
            Random random = new Random();
            String  val = "test";
            while (true){
                val+=val+random.nextInt(999999999)+random.nextInt(999999999);
            }
        }
    }
    

    ​ 将堆内存设置小点,可快速看到效果

    java -Xmx10m -Xms10m -XX:+PrintGCDetails TestDemo
    
    2、程序运行内存分析工具

    $JAVA_HOME: jdk路径

    • 可视化的工具:$JAVA_HOME/bin/jvisualvm
    • 命令查看: jmap(jmap -heap PID)

    相关文章

      网友评论

          本文标题:浅谈JVM堆内存空间调整

          本文链接:https://www.haomeiwen.com/subject/mkekhftx.html