当前位置:首页 > Java技术 > JVM调优实战——YoungGC的优化过程

JVM调优实战——YoungGC的优化过程

2022年11月09日 22:25:54Java技术8

问题

JVM调优实战——YoungGC的优化过程 _ JavaClub全栈架构师技术笔记
Young GC较为频繁。查看服务器的JVM参数如下

-Xms1000M 
-Xmx1800M 
-Xmn350M 
-Xss300K 
-XX:+DisableExplicitGC 
-XX:SurvivorRatio=4 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=70 
-XX:+CMSParallelRemarkEnabled 

-Xms表示初始化堆内存

-Xmx表示最大堆内存

-Xmn表示新生代内存

-XX:SurvivorRatio=4表示新生代的Eden是4/10,S1和S2各占3/10

因此Eden的内存大小为:0.435010241024字节, 为14010241024**字节

程序

/**
 * @date : 2020-03-22 09:48
 **/
public class JavaHeapTest {
     

  public final static int OUTOFMEMORY = 500 * 1024 * 1024;

  private String oom;

  StringBuffer tempOOM = new StringBuffer();

  public JavaHeapTest(int leng) {
     
    int i = 0;
    while (i < leng) {
     
      i++;
      try {
     
        tempOOM.append("a");
      } catch (OutOfMemoryError e) {
     
        e.printStackTrace();
        break;
      }
    }
    this.oom = tempOOM.toString();
  }

  public String getOom() {
     
    return oom;
  }

  public static void main(String[] args) {
     
    for(int i=0;i<50;i++) {
     
      JavaHeapTest javaHeapTest = new JavaHeapTest(OUTOFMEMORY);
      System.out.println(javaHeapTest.getOom().length());
    }
  }
}

原因

年轻代分为1个Eden和2个Survivor区(一个是from,另一个是to)。新创建的对象一般都会被分配到Eden区,如果经过第一次GC后仍然存活,就会被移到Survivor区。Survivor区中的对象每经过一次Minor
GC,年龄+1,当年龄增加到一定程度时,会被移动到年老代。

OUTOFMEMORY = 500 * 1024 * 1024,大于Eden内存的大小。新生代分配内存小,导致YoungGC的频繁触发。

初始化堆内存没有和最大堆内存一致,在每次GC后进行内存可能重新分配。

解决方法

提升新生代大小

将初始化堆内存设置为最大内存

将SurvivorRatio由4修改为8,让垃圾在新生代时尽可能的多被回收掉

-Xmn350M -> -Xmn800M
-XX:SurvivorRatio=4 -> -XX:SurvivorRatio=8
-Xms1000m ->-Xms1800m

效果

YoungGC次数明显减少
JVM调优实战——YoungGC的优化过程 _ JavaClub全栈架构师技术笔记

对象从出生到回收的全过程

我是一个普通的java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

参考链接

https://blog.csdn.net/wy5612087/article/details/52369677/
https://blog.csdn.net/cml_blog/article/details/81057966

作者:天才程序YUAN
来源链接:https://blog.csdn.net/JAck_chen0309/article/details/105023050

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/69192.html

标签: JVM调优
分享给朋友:

“JVM调优实战——YoungGC的优化过程” 的相关文章

性能优化|一张图带你了解JVM是如何进行内存分配

性能优化|一张图带你了解JVM是如何进行内存分配

对象优先在新生代分配 如果对象能够在eden区分配,那么就直接在eden区分配 如果eden区域大小不够新对象存储的话,则会触发一次minor gc, 如果minor gc后发现对象也无法在s区分配,则会直接在老年代中分配...

JVM学习1--数字存储,内存模型,指令重排

JVM学习1--数字存储,内存模型,指令重排

一、数字在计算机中的存储   整数:以补码形式存储。     补码:正数的补码是自身,负数的补码是取反码加1(取反码时符号位还是1)   浮点型:以float类型表示            注意一下,这八位指数实际上是(127...

深入理解JVM(1)——JVM内存模型

Java虚拟机的内存空间分为五个部分,分别是: 程序计数器; Java虚拟机栈 本地方法栈 堆 方法区 接下来对这五部分分别进行详细的介绍 1、程序计数器:   a)什么是程序计数器:程序计数器是内存中的一个很小...

JVM - 双亲委派

JVM - 双亲委派

# JVM - 双亲委派 JDK版本:1.8 # 1、双亲委派机制 Java虚拟机对于class文件采用的加载策略是按需加载。也就是当需要使用该类时才会将该类的.class文件加载到内存中生成Class对象。并且加载某...

深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型

原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011101723933875/?suggestedreading&wumii 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁...

【Java】JVM内存模型解析

【Java】JVM内存模型解析

   JVM内存模型主要分为五大区域:栈、堆、本地方法栈、程序计数器、方法区。   本地方法栈: 跟虚拟机栈非常相似,也是线程私有的,不过虚拟机栈是针对Java方法,而本地方法栈是针对native方法,也就是底层方...

jvm-java 内存模型  以及各个分区具体内容

jvm-java 内存模型 以及各个分区具体内容

java内存模型,这里其实是指 jvm运行时内存模型 1 每一个应用程序,都有一个JVM 而不是 多个应用程序,共享一个jvm 2 java源文件,首先通过编译器,把java语法的代码,编译成 jvm语法的字节码文件 这个过程,是不涉及到...

JVM学习笔记——java内存模型

JVM学习笔记——java内存模型

概述 JVM规范希望定义一套java内存模型(java memory model,JMM),使得java程序在不同的硬件平台下面都能展现出一致的内存访问机制。 java内存模型规定所有变量保存在主内存中,每个线程有自己的工作内存。线程的工作内存中保存了该线程使用到的变量的主内存拷...

深入底层之JVM的运行原理和性能调优

深入底层之JVM的运行原理和性能调优

学海无涯  不进则退 如存在问题 或有更好建议 请联系 作者QQ:2940500   前言: 了解程序的运行原理 要先学会看字节码文件 然后这样才能真正的去看程序是怎么运行的  ,不是说在开发工具 里deb...

jvisualVm监控远程的jvm

jvisualVm监控远程的jvm

jvisualVm是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。