jvm优化技巧,Java堆,old区,Eden区,s0和s1区,老年代,新生代
这里写目录标题
- jvm 说明
- 性能调优案例
jvm 说明
jvm既 Java Virtual Machine,既然是虚拟机,其必有存储空间,且不同的存储空间,存储特定的数据,如图所示:
- 虚拟机栈:存储基本数据类型、引用对象的变量、局部变量表等,这是线程私有的,每个线上线程的大小默认为1Mb。
- 程序计数器:存储字节指令的地地址,如果是本地方法栈,则存储undefined。
- 本地方法栈:由于java时表层语言,无法直接访问硬件,需要调用第三方语言,比如C、C++来操作硬件,比如创建内核线程,操作文件等。
- 方法区:存储jvm编译后地字节码文件,静态变量,常量,类信息等。
- 堆:
- 这是一块很重要的存储区域,也是我们性能调优重要依据,其用来存储java对象,gc回收地也是这一块数据。其分为老年代和新生代,默认数据大小为2 :1。
- 新生代又分为Eden区,s0区,s1区,默认数据大小为8 : 1 : 1。
- 新创建一个对象,首先判断能否放到Eden区,如果Eden区满了,会触发mirrorGc「所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”,停止应用程序的线程,但这段时间可以忽略不计」。此时Eden区和s0区中存活的对象移至s1区,并标志对象的分代年龄,eden区和s0区清空,如果此时对象还无法放置eden区,则直接放置老年代。反之亦然。
- 分代年龄存储到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区,老年代,新生代相关推荐
- JVM优化原理—Java架构师必须要知晓的知识
想要成为一名出色的Java架构师,必须要彻底了解Java的一个重要的特点那就JVM ...
- 大话Java堆的分区Eden、From Survivor、To Survivor、老年代
Java虚拟机运行时数据区一般分为:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 在<Java虚拟机规范>中对Java堆是这样描述的:"所有的对象实例以及数组都 ...
- eden区分配至s0、s1
1.eden如何分配给s0.s1 由此图看出,eden区做第一次YGC时,放入s0.s1时是随机的.这里存在一个from和to的概念,from是接收从eden区来YGC对象,to是由from占满时时转 ...
- JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点
47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...
- java-堆里面的分区:Eden,survival(from) to,老年代,各自的特点。
1.Eden区 Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁.而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空 ...
- java 老年代 新生代 永久代
Java GC.新生代.老年代 堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ). ...
- 045、JVM实战总结:动手实验:自己动手模拟出对象进入老年代的场景体验一下(上)
1.前文回顾 略.. 2.动态年龄判定规则 进入老年代的4个时机:1.年龄到了 2.动态年龄判断 3.Survivor 放不下 4.大对象(G1例外) 动态年龄判断:Young GC时,新对象(1岁) ...
- jvm性能调优实战 - 28年轻代存活的对象太多老年代放不下触发Full GC日志怎么看
文章目录 Pre Code JVM 参数 GC日志 日志分析 思考题 Pre 前两篇文章已经给大家分析清楚了对象是如何进入老年代的,接着我们就给大家演示一下,老年代的GC是如何触发的. Code JV ...
- jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
文章目录 Pre 动态年龄判定规则 动态年龄判定规则的部分示例代码 部分示例代码运行后产生的gc日志 完善示例代码 GC日志分析 Pre 上一篇文章我们已经带着大家初步分析了一次Young GC的日志 ...
最新文章
- 32岁的老程序员面试没通过,一问原因,挺突然的...
- C++中#if,#ifdef,ifndef
- 《时间简史》(评论一)(转载)
- android 手势事件 重写,Android实现通过手势控制图片大小缩放的方法
- 02ODBC基本概念
- java 抛出异常效率_Java异常处理机制
- linux 文件路径操作
- linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量
- 基于Colaboratory平台使用VGGNet网络进行图片分类
- 【2020/05/29 开庭】韦东山:闲鱼与盗版更配,坚决打击盗版,起诉到底绝不和解!
- 计算机公共课3-字处理软件Word 2010
- camille mumu 模拟器 frida 踩坑记录
- 维基链WICC | 项目进展周报第57期(1.6~1.12)
- gitbook踩坑指南-无法转pdf、epub等;pdf调字体大小
- 幽默笑话,隔壁的长舌妇,木子家原创
- 浅谈Object.assign
- 关于DCDC选型OVP的经验
- win10计算机无法使用网络资源管理器,win10无法显示可用网络怎么办
- 阿里云天池大赛赛题(深度学习)——视频增强(完整代码)
- KeyLife富翁笔记
热门文章
- 【DVB】DVB-T系统的参数和搜台介绍
- ComponentOne Studio Enterprise 2022
- ubuntu windows远程桌面 xfce4
- SonicWALL防火墙通过策略指定WAN口访问网络
- vue 路由的内置组件 router-view 详细介绍(有图有真相)
- 基于springboot+vue个性化商城商品推荐系统 前后端分离 协同过滤 全套视频教程
- 《百思不得姐》项目知识点总结
- XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印
- LM324的运放芯片的放大电路(四运放)运算-简单理解
- matlab对3r操作臂进行运动学仿真,并根据动力学方程设计控制器simulink仿真