跑得好好的Java进程,怎么突然就瘫痪了?

阿里妹导读:Java能成为应用最广泛的语言,和他的内存托管机制是分不开的。很多人眼中,Java虚拟机是透明的,只需知道核心api的用法,便可以专注于实现具体业务,然后依赖Java虚拟机运行甚至优化应用。

你是否有过这样的经历,跑得好好的Java进程,突然就瘫痪了。过于依赖Java虚拟机导致我们对问题无从下手,问题反复出现影响开发效率。其实,多数Java进程瘫痪的原因可以从java虚拟机层面找到原因,本文列举出导致Java进程瘫痪的一些共性原因,供大家交流和学习。

一、内存回收一直是java的痛点

用Java无法做出类似Redis这样的产品。java的内存回收机制使我们在编写代码时不需要关注对象的回收,同时加大了内存回收的消耗,标记复制需要做内存拷贝,标记清除算法则需要stop the world。所以我们在使用缓存的时候,量稍微大一些就需要借助类似Redis这样的中间件帮我们处理了。作为Javaer,我们享受了自动内存回收的安逸,同时也需要多了解下内存优化的方法。

二、为什么fgc停不下来了

1.什么情况下会gc

为了了解我们的系统为什么会不停fgc,我们需要先了解一下系统什么情况下会gc。在jvm层面,当我们new一个对象的时候,jvm会先在堆区分配对象需要的内存,这个时候如果内存不够的话,就需要gc了,gc的返回结果就是对象的空间地址。jvm会先进行ygc,也就是我们通常说的标记复制,如果ygc之后依然申请不到空间,就会进行fgc了。同理,如果fgc之后依然没有足够的空间,就会循环的进行fgc,直到申请到足够的空间。

2.导致不停的fgc的原因

如上文所讲,fgc有可能发生在你的每一行代码。如果fgc之后依然没有足够的空间,就会不停的fgc,直到申请到足够的空间。同时JVM会限制在抛出OutOfMemory错误之前在GC中花费的VM时间的比例。系统频繁FGC大致有五种情况:

  • 内存泄漏
  • 请求处理变慢导致同时申请内存的线程太多
  • metaspace 耗尽
  • 常量池将堆区占满
  • 堆外内存耗尽

1w,正常情况下处理一个请求的时间是1ms,那同一时刻并行的请求数量仅为10。如果性能发生抖动,每个请求处理的时间增加到100ms,那同一时刻并行的请求数量就会增加到100个。每个线程在处理请求的时候都会new一些对象出来,长时间存活的线程会造成类似内存泄漏的效果,将系统的内存耗尽。同时fgc也会加剧系统性能的开销,使系统变得更慢,产生雪崩。

三、如何让系统fgc之后仍然能活下来

1.杜绝内存泄漏

内存泄漏造成系统瘫痪的频率很高,有些系统定时从数据库拉取配置信息缓存到集合中,但是set不小心写成了list,最终在新增元素的时候内存溢出了。养成良好的编程习惯,多关注些细节,就能避免很多未知的问题。

2.并发限制:防止系统被撑死

每台服务器都有并行处理请求的上限,不管请求处理的多快,超过上限之后就会被撑死,对高并发的请求做好并发数限制是保持系统稳定的必要条件。需要注意的是,有一些系统在拒绝过多的请求时,也会做一些降级逻辑,降级逻辑也是有性能开销的,同样需要做并发限制,如果降级的请求超过并发限制,将不进行降级逻辑直接抛出异常。我们可使用的限流组件有很多,推荐我们阿里自研的Sentinel 和 Netflix开源的Hystrix。

3.自适应限流:防止系统被摸死

我们需要自适应限流有两个原因:

a. 每台服务器所处的环境是不一样的

有些服务器和离线计算的vm混部在一起,有些部署在实体机,有些部署在新老型号的机器上,每台服务器能承受的qps并不完全一样。统一配置分布式系统中每台服务器限流阀值,要么发挥不出每台服务器应有的作用,要么在高qps的情况下一些比较慢的服务器宕机,所以用服务器作为限流粒度是最合适的。

b.设置了正确的限流阀值,也可能被摸死

当单机承受的QPS 6~20倍于限流的流量时,拒绝一次请求的开销就无法忽略不记了。譬如春晚活动有些系统设置了正确的限流也被6~20倍于限流的流量冲垮。这种死法称为被摸死。应对这种情况,我们可以做的是在受到6~20倍的大流量时,动态减少限流的阀值。比如系统最开始接受1000qps,5000的拒绝流量过来会把系统摸死,这个时候我们调整系统的阀值,限流设置到100,被摸死的阀值就可以高一些,这样就算有6000个请求进来,我们系统也可以保证活下来。

4.异常流量监控:防止长尾请求拖垮系统

我们盯系统监控的时候通常会关注99分位的数据,但如果设置了合理的限流,系统依然被流量打挂,就要从那百分之一的长尾数据入手了。有些长尾数据对系统的影响会非常大。想象如果一个put请求传过来几十兆的数据,对java是极为不友好的,很有可能产生fgc,让请求变慢,导致一系列问题。

总之,磨刀不误砍柴工,当我们的系统因为fgc一次又一次重启的时候,不如花时间了解下系统产生性能问题的原因,将产生问题的那根针拔掉,晚上睡个安稳觉,白天更加充满活力的挖新坑。希望每个程序员手里都是一个稳定的系统。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

倒计时2天 | 张钹院士领衔,AI开发者大会20大论坛议程全揭秘!

2020年7月3—4日,由 CSDN 主办的第三届 AI 开发者大会(AI ProCon 2020)(大会官网:https://aiprocon.csdn.net/)将以线上直播的形式与大家相见。本次大会历时2天,一次性设立6大主题、20大精彩分论…

金融级云原生如何助力双十一?蚂蚁金服的实践经验是这样

蚂蚁金服金融科技产品技术部总经理杨冰,在发布会分享了蚂蚁金服金融级云原生在双十一的大规模应用实践,以下为演讲整理全文: 2018年双11,蚂蚁金服和网商银行正式应用云原生架构,2019年双11,蚂蚁金融级云原生…

KAFKA 最新版 Shell API单机生产与消费

文章目录一、KAFKA 启动与监控二、KAFKA 主题创建于查看生产与消费2.1. 查看主题列表2.2. 创建主题2.3. 查看主题信息2.4. 主题信息分析三、KAFKA 主题创建于查看生产与消费3.1. 客户端监听消息3.2. 生产消息3.3. 从头监听消息一、KAFKA 启动与监控 # 后台启动kafka kafka-ser…

地理文本处理技术在高德的演进(上)+

一、背景 地图App的功能可以简单概括为定位,搜索,导航三部分,分别解决在哪里,去哪里,和怎么去的问题。高德地图的搜索场景下,输入的是,地理相关的检索query,用户位置,Ap…

js倒计时

倒计时 js代码倒计时 var time_now_server,time_now_client,time_end,time_server_client,timerID; var oDate new Date();var year oDate.getFullYear(); //获取系统的年;var month oDate.getMonth()1; //获取系统月份,由于月份是从0开始计算&…

免费12个月!阿里云助力中小企业0成本上云

最新消息,阿里云宣布为企业用户推出云服务器免费12个月扶持计划,助力中小企业0成本上云。阿里云表示,该计划每年投入2000万,超5万中小企业受益,本计划已于2019年11月27日上线。 阿里云智能总裁张建锋在2019阿里云峰会…

KAFKA 同步和异步消息的发送(开发实战)

文章目录一、消费者监听1. 启动zk2. 启动kafka3. 创建主题4. 消费者监听消息二、生产者工程2.1. 依赖2.2. 生产者代码(同步)2.3. 生产者代码(异步)2.4. 发送消息2.5. 消费者监听消息2.6. 结果返回一、消费者监听 1. 启动zk zkSe…

如何通过自动增加索引,实现数据库查询耗时降低50%?

作者 | 利开园责编 | Carol封图 | CSDN 下载自视觉中国很多开发者都遇到类似这样的经历:一个产品功能开发测试都正常,发布上线后也正常,但是过一段后,如果有个活动或流量一大程序就突然卡了,也有可能流量正常也没搞活动…

重磅下载 | 核心系统100%上云,揭秘双11背后的云原生实践

2019 双11,订单创新峰值达到 54.4 万笔/秒,单日数据处理量达到 970PB,面对世界级的流量洪峰,今年的阿里交出了一份亮眼的云原生技术成绩单,并实现了100% 核心应用以云原生的方式上云: 双11 基础设施 100% …

./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No suc

./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory解决方案: yum -y install numactl

MongoDB与阿里云达成战略合作,最新数据库独家上线阿里云!

11月26日,开源数据库厂商MongoDB与阿里云在北京达成战略合作,作为合作的第一步,最新版MongoDB 4.2数据库产品正式上线阿里云平台。 目前阿里云成为全球唯一可提供最新版MongoDB服务的云厂商,双方合作打通了企业在云上使用最新版开…

程序员:我受够了!不想再在小厂里干Java了!

你是否熟悉这样的情形:每天10点到公司,打开电脑:10个小时的增删改查,搬砖写代码的一天就这样开始了。刚毕业时候的你踌躇满志,按照自己的原定计划,这时候应该混到了阿里P6。可现在在小厂苦苦挣扎&#xff0…

swiper轮播插件的使用

swiper轮播插件的使用 引入js文件 <script src"./js/swiper-3.4.2.min.js"></script> 接收后台返回的轮播数据&#xff0c;循环append进去&#xff0c;在append之后new swiper对象 $.each(data[data],function(i){list_item <div class"swip…

AnalyticDB for MySQL技术架构解析

企业数据需求不断变化&#xff0c;近年来变化趋势日益明显&#xff0c;从数据的3V特性看&#xff1a;体积&#xff0c;速度和变化&#xff1b;Big Data强调数据量&#xff0c;PB级以上&#xff0c;是静态数据。而Fast Data在数据量的基础上&#xff0c;意味着速度和和变化&…

ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘

mysql连数据库的时候报错: 1251 client does not support authentication protocol requested by server;consider upgrading Mysql client ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’localhost’ 先登录mysql mysql -u root -p输入密码 mysql> use …

双十一|又快又稳!闲鱼实时事件规则计算驱动平台

闲鱼双十一金鳞抽奖玩法 相信今年在11月7日-11月11日期间使用过闲鱼的用户&#xff0c;可能已经被如下图所示的幸运海星“砸”到过了。只要用户进入到指定的几个页面&#xff0c;或者在某些指定的页面有点击行为&#xff0c;就会触发到这样一个幸运之星。这就是今年闲鱼双十一…

“编程能力差的程序员,90%会输在这点上”谷歌AI专家:其实都是瞎努力

最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程和书籍&#xff0c;它们大都这样讲&#xff1a;先从 Python 人工智能的历史讲起开始&#xff0c;再介绍的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;最后学习机器学习、深度学习…

图片本地缓存

图片懒加载是通过判断http图片文件是否存在你的本地&#xff0c;如果未存在会将图片缓存到本地&#xff0c;如果已经存在就不做缓存&#xff0c;使用到的技术md5加密&#xff0c;mui、html5. 应客户的要求&#xff0c;需要做懒加载&#xff0c;本人也找了一段时间才找到这个代…

./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such

[rootiZbp10xlek93e0is7ye8o6Z bin]# ./mysqld --usermysql --basedir/usr/local/mysql-8.0 --datadir/usr/local/mysql-8.0/data/ --initialize 详细报错如下&#xff1a;./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No s…

阿里科学家再获世界级荣誉,平头哥首席科学家谢源当选AAASFellow

11月27日&#xff0c;美国科学促进会&#xff08;AAAS&#xff09;公布了2019年度会士&#xff08;Fellow&#xff09;增选结果&#xff0c;阿里巴巴平头哥首席科学家、达摩院高级研究员谢源当选&#xff0c;这也是信息、计算和通信领域新当选的24名Fellow之一&#xff0c;一同…