JVM探究

JVM--JVM finalize实现原理与由此引发的血案

大城市里の小女人 提交于 2020-01-08 14:58:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 原创内容,转载请注明出处 本文由一桩因为使用了JAVA finalize()而引发的血案入手,讲解了JVM中finalize()的实现原理和它的陷阱所在,希望能够对广大JAVA开发者起到一点警示作用。除此之外,本文从实际问题出发,描述了解决问题的过程和方法。如写模拟程序来重现问题,使用jmap工具进行分析等,希望对大家提供借鉴。 本文分三个章节,先介绍实际项目中遇到的问题,随后介绍了问题重现和分析方法,最后对问题的元凶,override finalize()的实现原理和陷阱进行了讲解和介绍。篇幅较长,可以分开独立阅读。 阅读本文前请确保自己的JVM的GC原理有足够理解,否则看起来会非常艰难。看过本文后若对finalize()仍有疑惑,或有不同意见,欢迎提出和指正。 DDB Proxy的一桩血案 入职没多久,接手一个分布式数据库(分库分表MySQL)的SQL Proxy(以下简称Proxy),在对它进行测试的过程张发现一些带limit的语句跑着跑着会引发整个代理服务器的TPS骤降。当时遇到这个问题毫无头绪,跟着一些人的建议检查了GC日志,结果发现TPS骤降的时候,Proxy进程正好开始频繁的full gc,full gc将近每3秒一次,一次维持2秒左右,TPS从2000直接降到100