• 话不多说,直接撸图:

1》Eden中通过可达性分析,存活下来的对象直接通过复制算法移动到From区域中,此时该对象的分代年龄加1:

2》当下一次虚拟机进行【Minor GC】时,会同时对【Eden】和【From】进行垃圾回收,如果搞对象还在使用中,则被移动到另一个【From】区,对象分代年龄再次加1:

3》当该对象年龄达到15时,此时它已经是一个老不死的对象了,所以可以移动到老年区:

  • 通常什么样的对象会被移动到老年代

1》线程池

2》静态变量引用的对象

3》Spring容器中的Bean,Service,Controller等

4》代码初始化的缓存对象等

  • 实践一下,打开【cmd】,输入【jvisualvm】指令,可以打开一个jdk自带的一个内存监控界面:

  • 当老年代中空间被占满后,则会触发【Full GC】 ,从而导致【STW】(即Stop the world);通常我们会对JVM进行调优,从而减少Full GC次数,已达到性能提高
  • 这里引申一个概念,【对象头】,以下例子为64位JVM下:

  • JVM如何调优呢?话不多说,上案例:

  • 通常我们会默认设置一个JVM空间分配:
#堆空间 默认3g,最大3g
#元空间 默认512MB,最大512MB
java -Xms3072M -Xms3072 -Xss1M -XX:MetaspaceSize=512M -XX:MetaspaceSize=512M -jar xxx.jar

  • 我们从GC角度分析一下,在【Eden】区存满后,此时会触发【minor GC】,改60MB对象(即订单对象)应该从【Eden】区移动到【S1】区域,但是【S1】区域大小仅有50MB,所以实际上会被直接移动到【old区】:

  • 此时会出现一个问题,如果【old区】被占满后,就会触发【Full GC】,即JVM会达到【Stop the world】情况,如果【Stop the world】过于频繁(即每13*33秒触发一次),则使得JVM性能急剧下降

那么问题来了,能否对JVM调优,让其几乎不发生【Full GC】?

  • 我们可以适当提高新生代内存,降低老年代内存分配:
#堆空间 默认3g,最大3g 新生代2g
#元空间 默认512MB,最大512MB
java -Xms3072M -Xms3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MetaspaceSize=256M -jar xxx.jar

  • 这样在【minor GC】会一同将【Eden】区和【S1】区同时回收,基本不会有对象可以移动至【old】区

【JVM】堆区域的一个详细了解并附带调优案例的更多相关文章

  1. JVM 内存分配、调优案例

    内存分配 对象优先在Eden区分配 大多数情况下,对象在新生代Eden区中分配.当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. HotSpot虚拟机提供了-XX:+PrintG ...

  2. jvm调优思路及调优案例

    jvm调优思路及调优案例 ​ 我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代(Eden)里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时 ...

  3. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  4. 性能调优案例分享:jvm crash的原因 1

    性能调优案例分享:jvm crash的原因   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  5. 《深入理解Java虚拟机》-----第5章 jvm调优案例分析与实战

    案例分析 高性能硬件上的程序部署策略 例 如 ,一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新的硬件为4个CPU.16GB物理内存,操作系统为64位CentOS 5.4 , Resin ...

  6. JVM菜鸟进阶高手之路七(tomcat调优以及tomcat7、8性能对比)

    转载请注明原创出处,谢谢! 因为每个链路都会对其性能造成影响,应该是全链路的修改压测(ak大神经常说全链路!).本次基本就是局域网,所以并没有怎么优化,其实也应该考虑进去的. Linux系统参数层面的 ...

  7. 【JVM.4】调优案例分析与实战

    之前已经介绍过处理Java虚拟机内存问题的知识与工具,在处理实际项目的问题时,除了知识与工具外,经验同样是一个很重要的因素.本章会介绍一些具有代表性的案例. 本章的内容推荐还是原文全篇看完的好,实在不 ...

  8. 【JVM】TroubleShooting之内存溢出异常(OOM)与调优

    1. OOM概述 If your application's execution time becomes longer and longer, or if the operating system ...

  9. Java之JVM调优案例分析与实战(3) - 堆外内存导致的溢出错误

    环境:基于B\S的点子考试系统,为了发现客户端能实时地从服务端接收考试数据,系统使用了逆向AJAX技术(也称Comet或Server Side Push),选用CometD1.1.1作为服务端推送框架 ...

随机推荐

  1. Hard filters (by GATK)

    Filter Symbol T. Definition QualByDepth QD 2.0 The variant confidence (from the QUAL field) divided ...

  2. 桌面上的Flutter:Electron又多了个对手

    从本质上看,Flutter是一个独立的二进制可执行文件.它不仅改变了移动设备的玩法,在桌面设备上也同样不可小觑.一次编写,可在Android.iOS.Windows.Mac和Linux上进行原生部署, ...

  3. CSDN排名及积分规则

    博客排行榜排名分值=个人Blog全部随笔与文章的阅读数之和+个人Blog全部评论数之和*10+个人所发表的评论数之和*50 CSDN博客积分计算规则: 1.每公布一篇原创或者翻译文章:可获得10分. ...

  4. JAVA I/O 与装饰者模式UML图

  5. linux多线程入门

    linux下的多线程通过pthread实现,下面给个简单的例子. #include <stdio.h> #include <stdlib.h> #include <pth ...

  6. Java——多线程之Lock锁

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  7. zigbee通用IO口小作业

    独立新建工程并编写.编译代码,实现按键控制流水灯运行,完成以下任务要求: [1]程序开始运行时,D4.D3.D6.D5灯全亮一会,然后全灭一会,开始进入流水灯. [2]流水灯的运行过程为:D4灯亮,其 ...

  8. Java创建对象的六种方法-权当记录一下

    1 简介 Java是面向对象的编程语言,只要使用它,就需要创建对象.Java创建对象有六种方法,实际常用的不会这么多,这里权当是记录一下. 2 六种方法 (1)使用new关键字 Pumpkin p1 ...

  9. 【MySQL基础总结】常用函数库

    常用函数库 数学函数 分类及含义 示例 字符串函数 分类及含义 示例 日期时间函数 分类及含义 示例 条件判断函数 分类及含义 示例 系统函数 分类及含义 加密函数 分类及定义 其他常用函数 分类及含 ...

  10. 【Hadoop离线基础总结】HDFS详细介绍

    HDFS详细介绍 分布式文件系统设计思路 概述 只有一台机器时的文件查找:hello.txt /export/servers/hello.txt 如果有多台机器时的文件查找:hello.txt nod ...