文档章节

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

影狼
 影狼
发布于 06/22 13:09
字数 1130
阅读 17
收藏 12
点赞 0
评论 0

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
博文 133
码字总数 65034
作品 0
海淀
程序员
JDK的命令行工具系列 (二) javap、jinfo、jmap

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

qingshanli
昨天
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
《成神之路-基础篇》JVM——JVM内存结构(已完结)

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

05/05
0
0
Java系列笔记 - JVM监控与调优

光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之。通过学习,我觉得JVM监控与调优主要的着眼点在于如何配置、如何监控、如何优化3点上。下面就...

明舞
2015/08/18
0
0
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
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性能优化, Part 5:Java的伸缩性

ImportNew注: JVM性能优化系列文章前4篇由ImportNew翻译(第一篇,第二篇,第三篇, 第四篇)。本文由新浪微博:吴杰 (@WildJay) 投稿至ImportNew。感谢吴杰! 如果你希望分享好的原创文章或...

梁杰_Jack
2014/10/30
0
0
深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶
06/22
0
0
JVM 堆内存设置 -Xmx -Xms

在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xmx 此设置控制 Java 堆的最大大...

不开心的时候不要学习
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
5分钟前
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
17分钟前
0
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
18分钟前
0
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
18分钟前
0
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
24分钟前
0
0
redis安装

https://www.cnblogs.com/feijl/p/6879929.html

ghou-靠墙哭
24分钟前
0
0
Spring核心——注解自动装载

从配置上扩展 之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识: ...

随风溜达的向日葵
28分钟前
2
0
ElasticSearch学习(8)—— SearchType

Elasticsearch有四种类型的SearchType 1、query and fetch 向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最...

叶枫啦啦
29分钟前
0
0
MYSQL备份工具-mysqldump

介绍 mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。 语法 mysqldump 的语法是...

郭恩洲_OSC博客
31分钟前
0
0
我的第一个go web框架

使用了beego等go web开发框架之后,感觉各种不方便,尤其是在接收参数、和自定义输出的时候,各种难受,定义各种model,这不是找事情嘛??尤其是在角色权限控制的时候我也感觉力不从心。。。...

独坐苔痕但观罗敷
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部