文档章节

005. 深入JVM学习—Java堆内存参数调整

易冥天
 易冥天
发布于 06/22 13:09
字数 1130
阅读 26
收藏 12

1. JVM整体内存调整图解(调优关键)


JVM整体内存调整

  1. 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张的时候,再将内存空间释放。

  2. 由于伸缩区的分配与释放消耗资源时间,所以目标为使伸缩区为0。

2. 堆内存空间调整参数


No.参数名称描述
01-Xms设置初始分配大小,默认为物理内存的 1/64
02-Xmx最大分配内存,默认为物理内存的 1/4
03-XX:+PrintGCDetails输出详细的GC处理日志
04-XX:+PrintGCTimeStamps输出GC的时间戳信息
05-XX:+PrintGCDateStamps输出GC时间戳信息(以日期的形式,如2018-08-15T16:53:15.155+0800)
06-XX:+PrintHeapAtGC在GC进行处理的前后打印堆内存信息
07-Xloggc:保存路径设置日志信息保存文件
  • 在整个堆内存的调整策略之中,有经验的人都只会调整两个参数:-Xmx、-Xms。
  • 当默认内存大小等于最大内存大小,伸缩区就会为0。

3. 范例


  • 如果想要取得内存的整体信息直接利用Runtime类即可。

1. 打印最大内存和可用内存

  • 程序

    import java.lang.Runtime;
    
    public class TestDemo {
        public static void main(String[] args) {
            Runtime run = Runtime.getRuntime();
            long maxMemory = run.maxMemory();
            long totalMemory = run.totalMemory();
            System.out.println("MAX_MEMORY = " + maxMemory + "B = " + (maxMemory / (double) 1024 / 1024) + "M");
            System.out.println("TOTAL_MEMORY = " + totalMemory + "B = " + (totalMemory / (double) 1024 / 1024) + "M");
        }
    }
    
  • 终端命令

    > javac TestDemo.java
    > java TestDemo
    
  • 输出结果

    MAX_MEMORY = 3787980800B = 3612.5M
    TOTAL_MEMORY = 255328256B = 243.5M
    
    • 存在可伸缩区,降低了程序性能

2. 手动设置最大内存和可用内存

  • 终端命令

    > java -Xmx4G -Xms4G TestDemo
    
  • 输出结果

    MAX_MEMORY = 4116185088B = 3925.5M
    TOTAL_MEMORY = 4116185088B = 3925.5M
    
    • 避免了伸缩区的可调策略,从而提高了程序性能

3. 观察GC的详细日志

  • 终端命令

    > java -Xmx4G -Xms4G -XX:+PrintGCDetails TestDemo
    
  • 输出结果

    MAX_MEMORY = 4116185088B = 3925.5M
    TOTAL_MEMORY = 4116185088B = 3925.5M
    Heap
     PSYoungGen      total 1223168K, used 62914K [0x000000076ab00000, 0x00000007c0000000, 0x00000007c0000000)
      eden space 1048576K, 6% used [0x000000076ab00000,0x000000076e870bd0,0x00000007aab00000)
      from space 174592K, 0% used [0x00000007b5580000,0x00000007b5580000,0x00000007c0000000)
      to   space 174592K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007b5580000)
     ParOldGen       total 2796544K, used 0K [0x00000006c0000000, 0x000000076ab00000, 0x000000076ab00000)
      object space 2796544K, 0% used [0x00000006c0000000,0x00000006c0000000,0x000000076ab00000)
     Metaspace       used 2611K, capacity 4486K, committed 4864K, reserved 1056768K
      class space    used 286K, capacity 386K, committed 512K, reserved 1048576K
    
  • 空间分析

    • PSYoungGen(新生代): 大概占3/8
    • ParOldGen(老年代): 大概占5/8
    • Metaspace(元空间): 在直接内存,不属于堆内存范围

4. 测试GC处理

  • 代码

    import java.util.Random;
    
    public class TestDemo {
        public static void main(String[] args) {
            Random rand = new Random();
            String str = "www.shadowolf.cn";
            while (true) {
                str += str + rand.nextInt(999999999) + rand.nextInt(999999999);
                str.intern(); // 强制产生垃圾
            }
        }
    }
    
  • 终端命令(空间给小一点)

    > javac TestDemo.java
    > java -Xmx10M -Xms10M -XX:+PrintGCDetails TestDemo
    
  • 输出结果

    [GC (Allocation Failure) [PSYoungGen: 2006K->503K(2560K)] 2006K->999K(9728K), 0.0010663 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [GC (Allocation Failure) [PSYoungGen: 2175K->487K(2560K)] 2671K->1999K(9728K), 0.0008205 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [GC (Allocation Failure) [PSYoungGen: 2160K->248K(2560K)] 3671K->2847K(9728K), 0.0009054 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [Full GC (Ergonomics) [PSYoungGen: 1376K->0K(2560K)] [ParOldGen: 6951K->1718K(7168K)] 8327K->1718K(9728K), [Metaspace: 2566K->2566K(1056768K)], 0.0061908 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
    [GC (Allocation Failure) [PSYoungGen: 1128K->0K(2560K)] 5023K->3894K(9728K), 0.0005362 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 3894K->3894K(9728K), 0.0005222 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 3894K->3893K(7168K)] 3894K->3893K(9728K), [Metaspace: 2566K->2566K(1056768K)], 0.0065284 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
    [GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] 3893K->3893K(8704K), 0.0004282 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    [Full GC (Allocation Failure) [PSYoungGen: 0K->0K(1536K)] [ParOldGen: 3893K->3880K(7168K)] 3893K->3880K(8704K), [Metaspace: 2566K->2566K(1056768K)], 0.0068218 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
            at java.util.Arrays.copyOf(Unknown Source)
            at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
            at java.lang.AbstractStringBuilder.append(Unknown Source)
            at java.lang.StringBuilder.append(Unknown Source)
            at TestDemo.main(TestDemo.java:8)
    Heap
     PSYoungGen      total 1536K, used 41K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
      eden space 1024K, 4% used [0x00000000ffd00000,0x00000000ffd0a4c0,0x00000000ffe00000)
      from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
      to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
     ParOldGen       total 7168K, used 3880K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
      object space 7168K, 54% used [0x00000000ff600000,0x00000000ff9ca078,0x00000000ffd00000)
     Metaspace       used 2597K, capacity 4486K, committed 4864K, reserved 1056768K
      class space    used 285K, capacity 386K, committed 512K, reserved 1048576K
    

4. 内存分析工具


  • 如果开发之中发现程序执行速度变慢,那么就需要对程序运行的内存进行分析。
  1. 可视化工具

    路径: JDK目录\bin\jvisualvm.exe

    D:\Softwares\Java\jdk1.8.0x64\bin\jvisualvm.exe
    
  2. 命令查看

    jmap -heap PID
    
    • PID查看方法
      • Windows:tasklist
      • Linux:ps

© 著作权归作者所有

共有 人打赏支持
易冥天
粉丝 31
博文 138
码字总数 70277
作品 0
海淀
程序员
JDK的命令行工具系列 (二) javap、jinfo、jmap

javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出public和protected类和成员 -package 只输...

qingshanli
07/16
0
0
My java——JVM(内存)二

续 My java——JVM(java 虚拟机)一 http://my.oschina.net/mynote/blog/113572 这里继续对java做深入的理解。 从(一)中说明了JVM就等同于操作系统,我们在学习操作系统的时候就会理解内存...

tngou
2013/03/14
0
0
MyEclipse_解决could not create the java virtual m...

MyEclipse的myelipse.ini原来配置: -vmargs -Xmx1024m -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=64m 今天早上启动就报could not create the java virtual machine错误。 myelipse.i......

atkone
2012/09/13
0
0
linux tomcat jvm内存优化

PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域 Heap space:存放Instance。 GC(Garbage Collection)...

大圈
2015/07/21
0
0
《成神之路-基础篇》JVM——JVM内存结构(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 参考文章: Java虚拟机的内存组成以及堆内存介绍 Java堆和栈...

05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis开发规范

一、键值设计 1.1 key名设计 (1)【建议】: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)【建议】:简洁性 保证语义的前提下...

IT--小哥
19分钟前
1
0
crunch 練習

crunch 10 10 -t 09%%%%%%%% -o tw_mobile_number.lst

BaiyuanLab
34分钟前
0
0
Kafka技术资料总结(不断更新中)

1、Kafka实践:到底该不该把不同类型的消息放在同一个主题中 2、Kafka剖析系列: Kafka剖析(一):Kafka背景及架构介绍 Kafka设计解析(二):Kafka High Availability (上) Kafka设计解析...

九州暮云
今天
2
0
面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
今天
5
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部