文档章节

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

易冥天
 易冥天
发布于 06/22 13:09
字数 1130
阅读 28
收藏 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
博文 139
码字总数 70641
作品 0
海淀
程序员
私信 提问
linux tomcat jvm内存优化

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

大圈
2015/07/21
0
0
JDK的命令行工具系列 (二) javap、jinfo、jmap

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

qingshanli
07/16
0
0
eclipse.ini配置文件

vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动...

曾赛
2010/05/19
0
0
My java——JVM(内存)二

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

tngou
2013/03/14
0
0
JVM系列第6讲:Java 虚拟机内存结构

看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了。那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了。在这个...

陈树义
11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

摘要: 有一个业务是查询最新审核的5条数据 ```sql SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `status` = 'ONLINE' ORDER BY `audit_time` D. 原来链接 ......

阿里云官方博客
16分钟前
1
0
详解如何用爬虫采集视频播放量数据(以腾讯视频为例)

现代社会提到大数据大家都知道这是近几年才形成的对于数据相关的新名词,在1980年,著名未来学家阿尔文·托夫勒便在 《第三次浪潮》一书中,将大数据热情地赞颂为“第三次浪潮的 华彩乐章”...

技术阿飞
21分钟前
2
0
区块链时代的拜占庭容错:Tendermint(二)

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》 原文作者:Ethan Buchman 翻译:饶云坤 校对:傅晓波 本文为节选 以下为正文: 本章阐述Tendermint共识算法...

万向区块链
34分钟前
0
0
AS连接网易Mumu模拟器

1、安装模拟器 打开这个网址现在模拟器然后安装 http://mumu.163.com/ 2、安装完成后启动模拟器 3、进入模拟器安装目录 例如本机的安装目录:C:\Program Files (x86)\MuMu\emulator\nemu\vmo...

HGMrWang
41分钟前
9
0
设计要做到扩展性强还挺难的

概述 在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是: 你不熟悉这个行业的业务的玩法 我举个例子来...

Sam哥哥聊技术
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部