这里写目录标题

  • jvm 说明
  • 性能调优案例

jvm 说明

jvm既 Java Virtual Machine,既然是虚拟机,其必有存储空间,且不同的存储空间,存储特定的数据,如图所示:

  1. 虚拟机栈:存储基本数据类型、引用对象的变量、局部变量表等,这是线程私有的,每个线上线程的大小默认为1Mb。
  2. 程序计数器:存储字节指令的地地址,如果是本地方法栈,则存储undefined。
  3. 本地方法栈:由于java时表层语言,无法直接访问硬件,需要调用第三方语言,比如C、C++来操作硬件,比如创建内核线程,操作文件等。
  4. 方法区:存储jvm编译后地字节码文件,静态变量,常量,类信息等。
  5. 堆:
    1. 这是一块很重要的存储区域,也是我们性能调优重要依据,其用来存储java对象,gc回收地也是这一块数据。其分为老年代和新生代,默认数据大小为2 :1。
    2. 新生代又分为Eden区,s0区,s1区,默认数据大小为8 : 1 : 1。
    3. 新创建一个对象,首先判断能否放到Eden区,如果Eden区满了,会触发mirrorGc「所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”,停止应用程序的线程,但这段时间可以忽略不计」。此时Eden区和s0区中存活的对象移至s1区,并标志对象的分代年龄,eden区和s0区清空,如果此时对象还无法放置eden区,则直接放置老年代。反之亦然。
    4. 分代年龄存储到java对象头中。如果old区满了,会触发fullGc,我们尽量避免fullGc「fullGc暂停所有正在执行的线程(Stop The World),来回收内存空间,这个时间需要考虑地」。

因而,我们所说的性能调优,那么就是堆中的性能调优。

性能调优案例

假设,现在有亿级流量电商的抢购活动,活跃用户为500万,付费转化率未10%。活跃时间在抢购的前几分钟,假设每秒产生1000单,而每台Tomcat的最高并发支持数为500,现有三台服务器,均为4核8g,每台服务器均部署Tomcat,使用nginx做负载均衡,有300单落在服务器1上,每单所在堆空间大小为1Kb,每秒大约产生300Kb的堆对象。可以使用lucene来动态计算javabean所在堆空间的大小。下单还会产生其他对象,比如优惠券、库存、积分等,此时放大20倍,也就是每秒产生6000Kb的对象。假设还会有订单查询的操作,此时再放大10倍,也就是每秒产生约58MB的对象。如图所示:

此时,堆初始值大小和最大值大小均为3072MB,老年代大小为2048MB,新生代大小为1024MB,Eden区大小为819MB,s0和s1区大小均为102MB。819Mb / 58Mb = 14秒,大约14秒Eden区爆满,触发mirrorGc,此时停止应用程序的线程。因而,此时需要调整JVM的配置参数,老年代大小为1024MB,新生代大小为2048MB,Eden区大小为1638MB,s0和s1区大小均为204MB。1638Mb/ 58Mb = 28秒,这样会减少mirrorGc,从而达到优化的效果。但更多的优化可根据实际线上jvm运行情况来看。

jvm优化技巧,Java堆,old区,Eden区,s0和s1区,老年代,新生代相关推荐

  1. JVM优化原理—Java架构师必须要知晓的知识

    想要成为一名出色的Java架构师,必须要彻底了解Java的一个重要的特点那就JVM                                                           ...

  2. 大话Java堆的分区Eden、From Survivor、To Survivor、老年代

    Java虚拟机运行时数据区一般分为:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 在<Java虚拟机规范>中对Java堆是这样描述的:"所有的对象实例以及数组都 ...

  3. eden区分配至s0、s1

    1.eden如何分配给s0.s1 由此图看出,eden区做第一次YGC时,放入s0.s1时是随机的.这里存在一个from和to的概念,from是接收从eden区来YGC对象,to是由from占满时时转 ...

  4. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

  5. java-堆里面的分区:Eden,survival(from) to,老年代,各自的特点。

    1.Eden区 Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁.而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空 ...

  6. java 老年代 新生代 永久代

    Java GC.新生代.老年代 堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ). ...

  7. 045、JVM实战总结:动手实验:自己动手模拟出对象进入老年代的场景体验一下(上)

    1.前文回顾 略.. 2.动态年龄判定规则 进入老年代的4个时机:1.年龄到了 2.动态年龄判断 3.Survivor 放不下 4.大对象(G1例外) 动态年龄判断:Young GC时,新对象(1岁) ...

  8. jvm性能调优实战 - 28年轻代存活的对象太多老年代放不下触发Full GC日志怎么看

    文章目录 Pre Code JVM 参数 GC日志 日志分析 思考题 Pre 前两篇文章已经给大家分析清楚了对象是如何进入老年代的,接着我们就给大家演示一下,老年代的GC是如何触发的. Code JV ...

  9. jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景

    文章目录 Pre 动态年龄判定规则 动态年龄判定规则的部分示例代码 部分示例代码运行后产生的gc日志 完善示例代码 GC日志分析 Pre 上一篇文章我们已经带着大家初步分析了一次Young GC的日志 ...

最新文章

  1. 32岁的老程序员面试没通过,一问原因,挺突然的...
  2. C++中#if,#ifdef,ifndef
  3. 《时间简史》(评论一)(转载)
  4. android 手势事件 重写,Android实现通过手势控制图片大小缩放的方法
  5. 02ODBC基本概念
  6. java 抛出异常效率_Java异常处理机制
  7. linux 文件路径操作
  8. linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量
  9. 基于Colaboratory平台使用VGGNet网络进行图片分类
  10. 【2020/05/29 开庭】韦东山:闲鱼与盗版更配,坚决打击盗版,起诉到底绝不和解!
  11. 计算机公共课3-字处理软件Word 2010
  12. camille mumu 模拟器 frida 踩坑记录
  13. 维基链WICC | 项目进展周报第57期(1.6~1.12)
  14. gitbook踩坑指南-无法转pdf、epub等;pdf调字体大小
  15. 幽默笑话,隔壁的长舌妇,木子家原创
  16. 浅谈Object.assign
  17. 关于DCDC选型OVP的经验
  18. win10计算机无法使用网络资源管理器,win10无法显示可用网络怎么办
  19. 阿里云天池大赛赛题(深度学习)——视频增强(完整代码)
  20. KeyLife富翁笔记

热门文章

  1. 【DVB】DVB-T系统的参数和搜台介绍
  2. ComponentOne Studio Enterprise 2022
  3. ubuntu windows远程桌面 xfce4
  4. SonicWALL防火墙通过策略指定WAN口访问网络
  5. vue 路由的内置组件 router-view 详细介绍(有图有真相)
  6. 基于springboot+vue个性化商城商品推荐系统 前后端分离 协同过滤 全套视频教程
  7. 《百思不得姐》项目知识点总结
  8. XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印
  9. LM324的运放芯片的放大电路(四运放)运算-简单理解
  10. matlab对3r操作臂进行运动学仿真,并根据动力学方程设计控制器simulink仿真