16

JVM系列【6】GC与调优2

 4 years ago
source link: https://segmentfault.com/a/1190000037509447
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

JVM系列笔记目录

  • 虚拟机的基础概念
  • class文件结构
  • class文件加载过程
  • jvm内存模型
  • JVM常用指令
  • GC与调优

了解HotSpot常用命令行参数

JVM的命令行参数参考: https://docs.oracle.com/javas...

-标准 所有版本支持

-X 非标准 特定版本支持

-XX 不稳定 下个版本可能会取消

常见和本文中可能用到的参数记录一下,具体垃圾回收器的参数后续调优的详细说明。

参数 说明 -Xmx 最大可用内存 -Xms 初始内存,一般和-Xmx相同,避免重新分配 -Xmn 年轻代大小,JVM内存=年轻代+老年代大小+永久代(一般64M) -XX:+PrintFlagsInitial 打印默认参数值 -XX:+PrintFlagsFinal 打印最终参数值 -XX:+PrintGC <br/>-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps 打印GC情况、GC详细日志、GC日志时间戳

常见垃圾回收器组合参数设定:(1.8)

如何查看JVM默认的垃圾回收器?

  1. java -XX:+PrintCommandLineFlags -version

RnIfy2i.png!mobile

  1. 通过GC日志来辨别是何种垃圾回收器

常见垃圾回收器组合参数设定:(1.8版本的)

>1. ​    -XX:+UseSerialGC = Serial New (DefNew) + Serial Old        小型程序使用,默认情况下不会是这种选项,HotSpot会根据计算及配置和JDK版本自动选择收集器
>2. ​    -XX:+UseParNewGC = ParNew + SerialOld  这个组合已经很少用(在某些版本中已经废弃)
>3. ​    -XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old
>4. ​    -XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + SerialOld】
>5. ​    -XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old
>6. ​    -XX:+UseG1GC = G1

PS的GC日志详解

每一种垃圾回收器的日志是不一样。这里提供一个样例来详细解释PS的GC日志。

public class HelloGC{
    public static void main(String[] args){
        System.out.println("HelloGC!");
        List list = new ArrayList();
        for(;;){
            // 死循环中每次分配1M大小的数组,存放在list中,JVM内存不足的时候会产生GC
            byte[] b = new byte[1024*1024];
            list.add(b);
        }   
    }
}

编译后启动命令: java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+UseParallelGC HelloGC

这里设置了最大内存为60M,初始内存为40M,新生代的内存为10M,使用PS垃圾回收器,并打印GC的回收情况。程序运行很快就会产生GC日志。

回收的日志情况:

uiQZbqb.png!mobile

HeapDump情况,0x000xxxx内存地址指的是:起始地址、使用空间结束地址、整体空间结束地址;

NbYnu2U.png!mobile

知识分享,转载请注明出处。学无先后,达者为先!


Recommend

  • 57
    • blog.51cto.com 6 years ago
    • Cache

    JVM层GC调优(上)-zero菌

    JVM内存结构简介(jdk1.8)JVM层的GC调优是生产环境上必不可少的一个环节,因为我们需要确定这个进程可以占用多少内存,以及设定一些参数的阀值。以此来优化项目的性能和提高可用性,而且这也是在面试中经常会被问到的问题。想要进行GC调优,我们首先需要简单了解...

  • 33
    • segmentfault.com 5 years ago
    • Cache

    JVM性能调优详解

    前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备。这篇文章带领大家学习JVM性能调优的知识。 性能调优 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、...

  • 25
    • zhenbianshu.github.io 5 years ago
    • Cache

    记一次简单的 JVM 调优

    背景 最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 5% 左右的提升,还算不错。 先介绍一下项目的基本情况: 项目...

  • 10
    • blog.shareworld.vip 4 years ago
    • Cache

    JVM调优原则

    JVM调优原则 Owen Jia 2020年09月10日 80次浏览 JVM调优原则 将进入老年代的对象数量降到最低 减少 Full GC 的执行...

  • 20
    • kimmking.blog.csdn.net 4 years ago
    • Cache

    JVM 问题排查分析上篇(调优经验)

    JVM 问题排查分析上篇(调优经验)

  • 15
    • zhenbianshu.github.io 4 years ago
    • Cache

    记一次简单的 JVM 调优 - 枕边书

    Nov 30, 2019 - 记一次简单的 JVM 调优 2617 Word Count

  • 8
    • duanguangguang.github.io 4 years ago
    • Cache

    JVM调优实战

    JVM调优实战 发表于 2020-04-18 ...

  • 9
    • nanyiniu.github.io 4 years ago
    • Cache

    深入JVM(三)JVM调优

    ¶ 参数分类 在多数项目中不需要进行JVM调优,在出现OOM或CPU飙高,往往是程序...

  • 3
    • my.oschina.net 3 years ago
    • Cache

    高并发场景下JVM调优实践之路

    2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验。 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可以看出,在观察周期里: 平均每10分钟Y...

  • 2

    JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。同时,在进行性能调优前,您需要理解并掌握以下的相关基础理论知识:...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK