核心内容摘要
Zookeeper在大数据领域的分布式系统监控指标分析
关注我们,设为星标,每天7:30不见不散,每日java干货分享如果你问一个 C 程序员“你最羡慕 Java 程序员什么”他大概率会说“羡慕他们不用手动写delete或者free。
”在 Java 的世界里内存管理是自动的。
你只管new对象用完随手一扔JVM 会派出一个默默无闻的保洁员 (GC 线程)帮你擦屁股回收内存。
但是这个保洁员有时很笨有时很暴躁。
如果不了解他的脾气你的系统就会莫名其妙地卡顿STW甚至直接崩溃OOM。
技术分析怎么判断谁是垃圾
引用计数法 vs 可达性分析•引用计数 (Reference Counting): 对象头里记个数谁引用我我就 1没人理我我就归零死。
• Bug: A 引用 BB 引用 A两人互相抱团计数器永远是 1永远死不掉循环引用。
Java 不用这个。
•可达性分析 (Reachability Analysis):Java 用的这个。
• 从一堆**“根对象” (GC Roots)** 出发比如 main 方法里的变量、静态变量。
• 顺藤摸瓜只要能摸到的对象就是活的。
• 摸不到的就是垃圾准备回收。
垃圾回收三板斧 (算法)•标记-清除 (Mark-Sweep):• 先把垃圾标出来然后直接清除。
• 缺点: 内存会变成“蜂窝煤”到处是碎片。
想放个大对象都放不下。
•复制算法 (Copying):• 把内存分两半。
只用一半。
满了就把活着的复制到另一半把这一半全部清空。
• 优点: 没碎片速度快。
• 缺点: 浪费一半内存。
(新生代最爱用这个)。
•标记-整理 (Mark-Compact):• 把活对象都往一端推然后把边界以外的全部砍掉。
• 优点: 没碎片不浪费空间。
• 缺点: 移动对象很累。
(老年代爱用这个)。
️
故事场景自助餐厅的保洁员为了搞懂最复杂的“分代收集理论”我们将Java 堆内存 (Heap)比作一家火爆的自助餐厅。
这里的规则是大部分客人吃完就走朝生夕死只有少部分客人会赖着不走长期存活。
区域划分•Eden 区 (大厅): 所有新进来的客人新对象都先安排在大厅吃饭。
•Survivor 区 (休息区): 分为 S0 和 S1 两块。
给那些还没吃完、但需要腾地方的客人临时坐坐。
•Old 区 (VIP 包厢): 给那些吃了几小时还不走的“老赖”客人。
Minor GC (清理大厅) —— 发生得非常频繁•场景: 大厅 (Eden) 坐满了新客人进不来了。
•动作: 保洁员冲进大厅。
• 大部分人吃完了垃圾直接收盘子赶人。
• 少部分人没吃完活对象保洁员把他们请到休息区 S0。
•清空大厅: 现在大厅又是空的了可以接新客了。
•算法: 这里用的是复制算法。
因为活下来的人少复制成本低。
年龄增长 (晋升 VIP)•规则: 客人每在休息区 (S0/S
熬过一次清理年龄 1。
•晋升: 当一个客人熬过了15 次清理默认值保洁员会说“大哥您是老顾客了请进VIP 包厢 (Old 区)慢慢吃别在大厅挤了。
”
Full GC / Major GC (全场大扫除) —— 尽量避免•场景: VIP 包厢 (Old 区) 也塞满了。
•动作: 保洁员不仅要扫大厅还要进包厢一个个查“你吃完没你吃完没”•后果: 这非常慢而且为了彻底打扫保洁员会按下**“时间暂停键”**。
STW (Stop The World) —— 时间暂停这是 GC 最可怕的地方。
为了防止保洁员在扫地时客人又乱扔垃圾JVM 会强行停止所有用户线程。
•现象: 你的网页突然卡死 1 秒然后又恢复了。
这就是发生了 STW。
•目标: 所有的 JVM 调优目的只有一个尽量减少 STW 的时间。
三、
总结垃圾回收器的进化史为了减少那个讨厌的 STW垃圾回收器进化了好几代
Serial: 单线程保洁员。
扫地时全场暂停。
适合小餐厅。
Parallel: 多线程保洁员。
好几个保洁员一起扫扫得快一点但还是全场暂停。
CMS (Concurrent Mark Sweep): 边吃饭边扫地。
保洁员尽量不打扰客人吃饭只有在关键时刻暂停一下。
G1 (Garbage First):现代主流。
它不分大厅包厢了而是把餐厅切成几百个小格子。
哪里垃圾多优先扫哪里。
一句话
总结GC 就是在“空间利用率”和“停顿时间”之间做平衡的艺术。
推荐阅读 点击标题可跳转50个Java代码示例全面掌握Lambda表达式与Stream API16 个 Java 代码“痛点”大改造“一般写法” VS “高级写法”终极对决看完代码质量飙升为什么高级 Java 开发工程师喜爱用策略模式精选Java代码片段覆盖10个常见编程场景的更优写法提升Java代码可靠性5个异常处理最佳实践为什么大佬的代码中几乎看不到 if-else因为他们都用这个...还在 Service 里疯狂注入其他 Service你早就该用 Spring 的事件机制了看完本文有收获请转发分享给更多人关注「java干货」加星标提升java技能❤️给个「推荐 」是最大的支持❤️.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}