Jvm参数设置-JVM(八)

上篇文章说了逃逸分析和标量,代码实例解析了内存分配先从eden区域开始,当内存不足的时候,才会进入s0和s1,发生yangGC,之后大内存会放入old,因为我们昨天程序运行了一个45M的对象,于是小对象在eden,对象在老年代。

Jvm创建对象之内存分配-JVM(七)

  • 大对象直接进入老年代

大对象指需要连续空间存储的对象(字符串,数组)。正常是eden放不下进入老年代,但是我们也可以用参数配置,当大于这个参数直接进入老年代。

-XX:PretenureSizeThreshold=1000 -XX:+UseSerialGC

只有Serial和ParNew垃圾收集器才生效的。

记得参数后面还有加个打印gc的参数-XX:PrintGCDetails

当我们设置了这个参数之后,则看到一个7M的数据明明可以放在eden,但是直接进入了老年代,前面的百分之14并不是我们代码的7M对象,而是eden自己内部的对象。

有什么优点呢?

可以避免大对象内存gc复制操作而降低效率。

  • 长期存活的也会进入老年代

既然是分代思想管理的,就必须知道对象哪些属于老年代,哪些属于年轻代,于是每个对象都有他的年龄。

如果对象eden经过第一次yangGc还能存活,并且被survivor容纳,则会进入survivor,这时候年龄会随着每次复制移动而增长,当年龄到了15岁(默认是15,CMS收集器默认6岁),就会进入老年代。

可以通过参数配置年龄代-XX:MaxTenuringThreshold

  • 对象动态年龄判断机制

我们有一个对象在eden,当yangGC后,状态还是活跃状态,则会进入survivor,但也会有一种情况直接进入老年代。

当一批对象大于等于survivor的百分之50,这时候则会把survivor里大于等于1年龄代的对象全部都移动到老年代里去,这样做的目的也是为了减少存活时间长的对象避免太多的复制移动。

  • 场景实例
  1. 亿级流量电商(每日点击上亿次)
  2. 如果平均每个用户点击二三十次,那么就有500万个日活用户。
  3. 付费转换率是百分之10,那就是每天50万单子

(如果是正常三四小时内完成,那么每秒几十订单影响不大)

  1. 但如果高峰场景,每秒1000订单

订单系统是4核8G,300单每秒,三台机器

假设订单表几十个字段,阿里巴巴规范表字段不可以太多,每个订单有300个字,大概1KB。

  1. 那么300单*1KB = 300kb,每秒300KB

下单还能涉及到其他对象,比如库存,优惠卷,积分等。

6、300kb*20*10 = 60000 KB每秒

(每秒大概60M进入eden,这60M对象大概会在1s都会变成垃圾对象)

可以通过命令指定堆位3G,对最大值也3G,栈帧1M,元空间512M。

Java -Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=512M

-XX:MaxMetasspaceSize=512M -jar microservice-sureka.jar

这时候知道通过亿级流量日活大概有60M的数据进入eden,14s的60M就会占满我们的eden,满了则会yangGC,这时候前面13s的对象都会被垃圾回收,因为他是垃圾对象,因为回收的时候会STW(stop the word),导致最后1s的还没被回收,这时候eden因为对象动态年龄判断机制,直接进入了old,在old里1s后就属于垃圾了,之后old满之后则会发生fullGC,很明显,这样频繁发生fullGC是不合理的。

所以我们设置jvm参数是要根据实际情况来设置的,那么这种怎么设置呢?

Java -Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=512M -Xmn2048

-XX:MaxMetasspaceSize=512M -jar microservice-sureka.jar

这时候会发生什么呢?

老年代只剩下1个G,年轻代有2个G,那么eden就是1.6G,S0和S1都是200M。

这时候则能放的下S0,不会触发动态年龄判断,这时候则会直接在SURVIVOR会回收,不会进入老年代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18177.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--并查集的进一步优化

数据结构–并查集的进一步优化 Find操作的优化(压缩路径) 压缩路径 − − F i n d 操作,先找到根节点,再将查找路径上所有结点都挂到根结点下 \color{red}压缩路径 -- Find操作,先找到根节点,再将查找路径上所有结点都挂到根结点…

【云原生 • Kubernetes】认识 k8s、k8s 架构、核心概念点介绍

目录 一、Kubernetes 简介 二、Kubernetes 架构 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服务 service 6. 发布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念总结 一、Kubern…

TCP 协议(二)连接与断开

三次握手与四次挥手 在学习计算机网络之前,我们对于“三次握手”和“四次挥手”有所耳闻,其实这两个名词指的就是 TCP 连接与断开过程。 三次握手过程 三次握手是为了让客户端和服务端分别确认自己和对方接收和发送消息的能力是正常的。 一开始&#x…

vulnhub靶机渗透:PWNLAB: INIT

PWNLAB: INIT 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描扫描总结 80端口目录爆破LFI利用 3306端口回到80端口文件上传 获得立足点横向移动提权总结参考 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP:192.168.56.103 kali IP&#xff…

【Redis基础】快速入门

一、初识Redis 1. 认识NoSQL 2. 认识Redis Redis诞生于2009年,全称是Remote Dictionary Server(远程词典服务器),是一个基于内存的键值型NoSQL数据库特征 (1)键值(key-value)型&am…

在vite创建的vue3项目中使用Cesium加载纽约建筑模型、设置样式,划分城市区域并着色

在vite创建的vue3项目中使用Cesium加载纽约建筑模型、设置样式,划分城市区域并着色 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件:添加Ce…

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

【Linux】- 常用指令和运行级别

运行级别 1.1🚞指定运行级别1.2🚊帮助指令1.3🚔文件目录类指令2.1 **ls 指令**2.2 **cd 指令**2.3 **mkdir 指令**2.4 **rmdir 指令**3.1 **touch 指令**3.2 **cp 指令**3.3 **rm 指令**3.4 **mv 指令**4.1 **cat 指令**4.2 **more 指令**4.3…

【C++学习笔记】C++如何规范C语言中的类型转换

C的类型转换 1 C语言中类型转换的缺陷2 为什么C要规范C的类型转换3 C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 1 C语言中类型转换的缺陷 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配&a…

【unity小技巧】委托(Delegate)的基础使用和介绍

文章目录 一、前言1. 什么是委托?2. 使用委托的优点 二、举例说明1. 例12. 例2 三、案例四、泛型委托Action和Func1. Action委托2. Func委托 五、参考六、完结 一、前言 1. 什么是委托? 在Unity中,委托(Delegate)是一…

【分布式】 ELK 企业级日志分析系统 二

目录 一、FilebeatELK 部署1.1 环境部署 二、grok 正则捕获插件mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、FilebeatELK 部署 1.1 环境部署 Node1节点(2C/4G):node1/192.168.137.101 Elasticsearch Node2节点&…

【Distributed】分布式ELK日志文件分析系统(二)

文章目录 一、FilebeatELK 部署1. 环境部署2. 在 Filebeat 节点上操作2.1 安装 Filebeat2.2 设置 filebeat 的主配置文件 3. 在 Apache 节点上操作3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件 3. 启动3.1 在Logstash 组件所在节点启动3.2 在 Filebeat 节点 启动…