阿里妹导读: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一次又一次重启的时候,不如花时间了解下系统产生性能问题的原因,将产生问题的那根针拔掉,晚上睡个安稳觉,白天更加充满活力的挖新坑。希望每个程序员手里都是一个稳定的系统。

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

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

  1. java中服务器瘫痪怎么办,跑的好好的 Java 进程,怎么突然就瘫痪了

    1.跑的好好的 Java 进程,怎么突然就瘫痪了 用 Java 无法做出类似 Redis 这样的产品.Java 的内存回收机制使我们在编写代码时不需要关注对象的回收,同时加大了内存回收的消耗,标记复制 ...

  2. java 监控linux服务器cpu使用率、内存使用率、磁盘使用率、java进程是否存活等服务

    java 监控linux服务器cpu.内存.java进程是否存活,发现异常发送邮件提醒 前一段时间在维护一个N年前的项目,这个项目有十几个服务器,每个服务器上有十几个服务.接手后的几个星期天天有事,要 ...

  3. 趣味编程故事|java进程占用cpu过高怎么办,别急我来帮你

    关注公众号"AI码师"领取2021最新面试资料一份 [主演] 运维小哥:小李 测试小姐姐:小红 开发人员:本色出演 [剧情] 在一个阳光明媚的清晨,原本还在睡梦中的我,被小李(运维 ...

  4. 测试工具jmeter清理缓存关闭java进程

    上周用jmeter跑接口,发现创建接口的请求body一直用的是修改之前的请求body,重新安装了jmeter也没有用. 经了解需要关闭java进程,tasklist查看java进程普通的强制关闭一直也 ...

  5. java进程老挂掉_JAVA进程突然挂掉

    JVM内存不足导致进程死掉. Native memory allocation (mmap) failed to map 一台服务器上部署很多JAVA进程已经是微服务的常态,但也有些坑. 背景,测试服 ...

  6. JAVA进程突然挂掉

    2019独角兽企业重金招聘Python工程师标准>>> JVM内存不足导致进程死掉. Native memory allocation (mmap) failed to map 一台 ...

  7. java进程老挂掉_JAVA进程突然挂掉 - 1024菜bird的个人空间 - OSCHINA - 中文开源技术交流社区...

    JVM内存不足导致进程死掉. Native memory allocation (mmap) failed to map 一台服务器上部署很多JAVA进程已经是微服务的常态,但也有些坑. 背景,测试服 ...

  8. Java进程占用内存超高分析

    Java进程占用内存超高分析_ 1. 报错 2. 解决 3. 我用到的解决方法 写了一个Java服务,没有定时服务,没有线程池,没有重度的读写,只是对外提供了几个接口,接口的访问量并不高,结果占用内存 ...

  9. gcore java_获取一直FullGC下的java进程HeapDump的小技巧

    小技巧 我们应用的java进程出问题的时候,我们往往会用jmap或者gcore拿到一份HeapDump,拿到MAT上做一次Heap分析,但是 如果你排查的是一直在FullGC的gc问题,你Dump下来 ...

最新文章

  1. 安装JDK 1.7时could not locate a suitable jar utility解决方案
  2. excel2010冻结行列
  3. java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)
  4. erp系统是什么转型
  5. opencv中java的dmatch_关于OpenCV的那些事——ORB的brief描述子(256bit)的match心得
  6. 新风系统风速推荐表_谈实验室通风系统设计
  7. linux命令行sip电话,基于嵌入式Linux和MiniGUI的SIP电话设计
  8. java毕向东helloworld_毕向东java基础课学习笔记2——Hello world
  9. 翟菜花:以科创板的科技成色,错失联想是相当大的损失
  10. wordpress Avada主题banner制作
  11. 阿丹学财报(1)- 财报是用来证伪的
  12. 关于我用过的机械键盘
  13. [收藏]基于Spark Graphframes的社交关系图谱项目实战
  14. org.apache.ibatis.type.TypeException: The alias ‘XXXX‘ is already mapped to the value ‘XXXX‘ 问题解决
  15. 苹果风波不断,Siri语音助手面临隐私诉讼
  16. 谈谈自己对微信商城的看法
  17. C#网络爬虫(获取需要登录的网站数据)
  18. 3D眩晕症及解决方法
  19. JavaScript对象(Object)
  20. FineReport帮助文档一眼尽收眼底

热门文章

  1. php redis与me m,Redis(十) —— 为php增加redis扩展
  2. python爬虫分析_Python爬虫解析网页的4种方式
  3. python分布式对象存储_推荐:一款分布式的对象存储服务
  4. 爬虫python软件准备_工具准备的差不多了,接下来就是python爬虫的封装了
  5. python怎么导入os模块_python之os模块
  6. oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库
  7. 田刚院士:鼓励发展新型特色研究型大学
  8. 一位女博士五年的艰难毕业历程
  9. 计算机c盘丢失,电脑C盘丢失的视频文件怎么恢复?方法讲解,轻松搞定
  10. linux双屏播放视频,Ubuntu Linux下双屏显示解决方案