内存回收一直是 Java的痛点
---------------
用 Java 无法做出类似 Redis 这样的产品。Java 的内存回收机制使我们在编写代码时不需要关注对象的回收,同时加大了内存回收的消耗,标记复制需要做内存拷贝,标记清除算法则需要 stop the world 。所以我们在使用缓存的时候,量稍微大一些就需要借助类似 Redis 这样的中间件帮我们处理了。作为 Javaer ,我们享受了自动内存回收的安逸,同时也需要多了解下内存优化的方法。
为什么 FGC 停不下来了
-------------
### 什么情况下会 GC
为了了解我们的系统为什么会不停 FGC ,我们需要先了解一下系统什么情况下会 GC 。在 Jvm 层面,当我们 new 一个对象的时候, Jvm 会先在堆区分配对象需要的内存,这个时候如果内存不够的话,就需要 GC 了, GC 的返回结果就是对象的空间地址。Jvm 会先进行 ygc ,也就是我们通常说的标记复制,如果 ygc 之后依然申请不到空间,就会进行 FGC 了。同理,如果 FGC 之后依然没有足够的空间,就会循环的进行 FGC ,直到申请到足够的空间。
### 导致不停的 FGC 的原因
如上文所讲, FGC 有可能发生在你的每一行代码。如果 FGC 之后依然没有足够的空间,就会不停的 FGC ,直到申请到足够的空间。同时 JVM 会限制在抛出 OutOfMemory 错误之前在 GC 中花费的 VM 时间的比例。系统频繁 F 大致有五种情况:
* 内存泄漏
* 请求处理变慢导致同时申请内存的线程太多
* metaspace 耗尽
* 常量池将堆区占满
* 堆外内存耗尽
在一个高并发的系统中,多数 FGC 是请求处理变慢导致的。假设单机承受 tps 是1w,正常情况下处理一个请求的时间是 1ms ,那同一时刻并行的请求数量仅为 10 。如果性能发生抖动,每个请求处理的时间增加到 100ms ,那同一时刻并行的请求数量就会增加到 100 个。每个线程在处理请求的时候都会 new 一些对象出来,长时间存活的线程会造成类似内存泄漏的效果,将系统的内存耗尽。同时 FGC 也会加剧系统性能的开销,使系统变得更慢,产生雪崩。
如何让系统 FGC 之后仍然能活下来
------------------
### 杜绝内存泄漏
内存泄漏产生的原因以及解决办法网上有很多资料,这里就不写了。内存泄漏造成系统瘫痪的频率很高,有些系统定时从数据库拉取配置信息缓存到集合中,但是 set 不小心写成了 list ,最终在新增元素的时候内存溢出了。养成良好的编程习惯,多关注些细节,就能避免很多未知的问题。
### 并发限制:防止系统被撑死
每台服务器都有并行处理请求的上限,不管请求处理的多快,超过上限之后就会被撑死,对高并发的请求做好并发数限制是保持系统稳定的必要条件。需要注意的是,有一些系统在拒绝过多的请求时,也会做一些降级逻辑,降级逻辑也是有性能开销的,同样需要做并发限制,如果降级的请求超过并发限制,将不进行降级逻辑直接抛出异常。
### 自适应限流:防止系统被摸死
我们需要自适应限流有两个原因:
**每台服务器所处的环境是不一样的**
有些服务器和离线计算的 vm 混部在一起,有些部署在实体机,有些部署在新老型号的机器上,每台服务器能承受的 qps 并不完全一样。统一配置分布式系统中每台服务器限流阀值,要么发挥不出每台服务器应有的作用,要么在高 qps 的情况下一些比较慢的服务器宕机,所以用服务器作为限流粒度是最合适的。
**设置了正确的限流阀值,也可能被摸死**
当单机承受的 QPS 6~20 倍于限流的流量时,拒绝一次请求的开销就无法忽略不记了。譬如春晚活动有些系统设置了正确的限流也被 6~20 倍于限流的流量冲垮。这种死法称为被摸死。应对这种情况,我们可以做的是在受到 6~20 倍的大流量时,动态减少限流的阀值。比如系统最开始接受 1000qps ,5000 的拒绝流量过来会把系统摸死,这个时候我们调整系统的阀值,限流设置到 100 ,被摸死的阀值就可以高一些,这样就算有 6000 个请求进来,我们系统也可以保证活下来。
阿里有结合算法动态调整单机限流阀的产品,已经对外公布了,感兴趣的同学可以搜一下淘系技术公众号中的 诺亚自适应限流 的相关内容。
异常流量监控:防止长尾请求拖垮系统
-----------------
我们盯系统监控的时候通常会关注 99 分位的数据,但如果设置了合理的限流,系统依然被流量打挂,就要从那百分之一的长尾数据入手了。有些长尾数据对系统的影响会非常大。想象如果一个 put 请求传过来几十兆的数据,对 Java 是极为不友好的,很有可能产生 FGC ,让请求变慢,导致一系列问题。
总之,磨刀不误砍柴工,当我们的系统因为 FGC 一次又一次重启的时候,不如花时间了解下系统产生性能问题的原因,将产生问题的那根针拔掉,晚上睡个安稳觉,白天更加充满活力的挖新坑。希望每个程序员手里都是一个稳定的系统。
[原文链接](https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/739645%3Futm_content%3Dg_1000094672)
本文为阿里云内容,未经允许不得转载。
分享到:
相关推荐
Java编写的进程管理涉及到操作系统的核心概念,特别是在多线程环境下如何有效地管理和调度进程。在这个话题中,我们将深入探讨Java如何实现进程控制,并结合银行家算法和随机算法来优化这一过程。 首先,我们要明白...
这种机制可以防止系统在进程频繁崩溃时陷入无限重启的循环,从而保护系统资源,防止滥用资源导致系统瘫痪。 在Linux系统中实现进程监控和进程守护,常见的工具有`systemd`、`supervisord`等。`systemd`是Linux系统...
3. **插件进程**:如Flash、Java、PDF阅读器等插件都运行在独立的进程中,这不仅提升了安全性,还确保了一个插件的崩溃不会导致整个浏览器瘫痪。 4. **扩展进程**:浏览器扩展也运行在独立进程中,避免了扩展之间的...
【Java爬虫技术详解】 Java爬虫是一种使用Java编程语言实现的网络爬虫,它能够自动地遍历互联网上的网页,抓取所需信息。在Java中实现爬虫,主要涉及网络编程、HTML解析和数据存储等多个领域。下面将详细介绍这些...
周期性瘫痪是一种罕见的神经肌肉疾病,主要特征是反复出现的骨骼肌松弛性瘫痪,通常伴随着血清钾水平的变化。根据发作时的血钾浓度,周期性瘫痪可分为低钾型、高钾型和正常钾型。疾病发作突然,肌无力可持续数小时至...
11. 小区消防设施瘫痪的绿色通道服务:温州市物业修理资金管理中心提供“绿色通道”服务,对于消防设备损坏、缺件等状况,不需要两个“2/3”同意,就能先申请到一笔资金进行修复。 小区消防设施瘫痪情况说明是小区...
这份Oracle Java Magazine的标题为“Java Magazine September/October 2018”,正如描述中所说,它是面向Java开发人员的必读程序员杂志,致力于提供前沿的技术内容。该杂志的标签为“java magazine”,这部分内容...
驱动隐藏保护进程是一种技术手段,通常用于保护系统中的关键组件,如驱动程序,免受恶意软件的攻击或未经授权的修改。这种技术的核心是通过隐藏进程的方式,使得普通用户或者恶意软件难以发现和干预这些重要的系统...
在Windows XP系统中,进程管理是一项关键操作,用于监控和控制正在运行的程序和服务。"进程强杀"指的是能够强制结束任何进程,包括那些拥有SYSTEM权限的高权限进程。这通常需要特殊的工具和技术,因为普通的任务管理...
基于C/S的用户间通信需要由服务器中转,在C/S中的服务器故障将导致整个网络通信的瘫痪。而基于P2P的用户间通信则是直接通信,去掉了服务器这一层,带来的显著优点是通信时没有单一的失败点,一个用户的故障不会影响...
建议不要下载,等下搞坏你的电脑我可不负责。
在IT行业中,监控进程是系统管理的一个重要环节,它能够确保关键服务的稳定运行,防止因为某个进程意外终止导致整个系统的瘫痪。本项目名为"监控进程程序",其核心功能在于检测特定进程的状态,一旦该进程结束,程序...
周期性瘫痪是一种罕见的神经肌肉疾病,主要特征是反复出现突发性的骨骼肌无力或瘫痪。这种病症根据发作时血液中的钾离子浓度变化,可分为低钾型、正常血钾型和高钾型周期性瘫痪。其中,低钾型最为常见,并且有可能与...
未经授权地终止关键系统进程可能导致系统不稳定,甚至瘫痪。因此,"进程终结者2.0"应谨慎使用,并遵循最小权限原则,仅在必要时使用调试权限,避免对系统造成不必要的损害。 总的来说,"进程终结者2.0"不仅是一个...
1. **资源竞争**:多个进程对有限的资源进行争夺,如果分配不当,就可能导致死锁。 2. **互斥使用**:某些资源在同一时间只能被一个进程使用,这可能导致进程间的相互等待。 3. **不可抢占**:已经分配给某个进程的...
标题 "两秒让打开的电脑瘫痪(要小心)" 提到的情况可能涉及到恶意软件或病毒攻击,尤其是当描述重复强调“两秒让打开的电脑瘫痪”时,这通常意味着某种快速生效的有害程序。这里我们将深入探讨相关知识点: 1. **...
网络系统瘫痪是任何依赖信息技术的企业可能面临的严重问题,它可能导致业务中断,数据丢失,甚至声誉损害。因此,建立一个有效的网络系统瘫痪应急处理方案流程至关重要。以下将详细阐述这个流程的关键步骤。 首先,...
GGhost一键恢复是基于ghost(v11.02)和grub4dos的免费系统备份和还原工具,具有良好的兼容性、易用性与丰富的自定义功能。 可运行于微软主流操作系统Windows 2000、xp、2003、2008、vista和Windows 7,支持32位及64...
但你电脑用着用着它就跳出来,你也不知道是那个程序带来的,严重的时候只要出来会导致网络瘫痪,使用说明:解压到d盘根目录3个,一个是注册删除用(注册后开机自启动主程序),一个主程序,一个是把自己需要结束的...