阿里妹导读:Java能成为应用最普遍的语言,和他的内存托管机制是分不开的。不少人眼中,Java虚拟机是透明的,只需知道核心api的用法,即可以专一于实现具体业务,而后依赖Java虚拟机运行甚至优化应用。你是否有过这样的经历,跑得好好的Java进程,忽然就瘫痪了。过于依赖Java虚拟机致使咱们对问题无从下手,问题反复出现影响开发效率。其实,多数Java进程瘫痪的缘由能够从java虚拟机层面找到缘由,本文列举出致使Java进程瘫痪的一些共性缘由,供你们交流和学习。java
用Java没法作出相似Redis这样的产品。java的内存回收机制使咱们在编写代码时不须要关注对象的回收,同时加大了内存回收的消耗,标记复制须要作内存拷贝,标记清除算法则须要stop the world。因此咱们在使用缓存的时候,量稍微大一些就须要借助相似Redis这样的中间件帮咱们处理了。做为Javaer,咱们享受了自动内存回收的安逸,同时也须要多了解下内存优化的方法。程序员
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大体有五种状况:api
1w,正常状况下处理一个请求的时间是1ms,那同一时刻并行的请求数量仅为10。若是性能发生抖动,每一个请求处理的时间增长到100ms,那同一时刻并行的请求数量就会增长到100个。每一个线程在处理请求的时候都会new一些对象出来,长时间存活的线程会形成相似内存泄漏的效果,将系统的内存耗尽。同时fgc也会加重系统性能的开销,使系统变得更慢,产生雪崩。缓存
1.杜绝内存泄漏服务器
内存泄漏形成系统瘫痪的频率很高,有些系统定时从数据库拉取配置信息缓存到集合中,可是set不当心写成了list,最终在新增元素的时候内存溢出了。养成良好的编程习惯,多关注些细节,就能避免不少未知的问题。并发
2.并发限制:防止系统被撑死jvm
每台服务器都有并行处理请求的上限,无论请求处理的多快,超过上限以后就会被撑死,对高并发的请求作好并发数限制是保持系统稳定的必要条件。须要注意的是,有一些系统在拒绝过多的请求时,也会作一些降级逻辑,降级逻辑也是有性能开销的,一样须要作并发限制,若是降级的请求超过并发限制,将不进行降级逻辑直接抛出异常。咱们可以使用的限流组件有不少,推荐咱们阿里自研的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一次又一次重启的时候,不如花时间了解下系统产生性能问题的缘由,将产生问题的那根针拔掉,晚上睡个安稳觉,白天更加充满活力的挖新坑。但愿每一个程序员手里都是一个稳定的系统。
参考资料:
jvm调优总结:
https://hllvm-group.iteye.com/group/wiki/?category_id=301
诺亚(Noah)自适应限流 稳定性利器 :
https://www.atatech.org/articles/149208
本文做者:通木
本文来自云栖社区合做伙伴“阿里技术”,如需转载请联系原做者。