性插久久

俄罗斯videodes极品是Linux调试及运维一个很好的用具
发布日期:2022-04-22 23:13    点击次数:192

 俄罗斯videodes极品

弁言

记载一次线上JVM堆外内存泄漏问题的排查过程与思绪,其中夹带一些「JVM内存分拨的旨趣分析」以及「常用的JVM问题排查技巧和用具共享」,但愿对行家有所匡助。

在统共这个词排查过程中,我也走了不少弯路,可是在著述中我仍然会把完好的思绪和想法写出来,当做一次阅历劝诫,给后人参考,著述终末也总结了下内存泄漏问题快速排查的几个原则。

「本文的主要内容:」

故障姿色和排查过程 故障原因和搞定决策分析 JVM堆内内存和堆外内存分拨旨趣 常用的进度内存泄漏排查请示和用具先容和使用

故障姿色

8月12日中午午休时候,咱们买卖劳动收到告警,劳动进度占用容器的物理内存(16G)跨越了80%的阈值,何况还在不断上升。

 

监控系统调出图表检验:

 

像是Java进度发生了内存泄漏,而咱们堆内存的规矩是4G,这种大于4G将近吃满内存应该是JVM堆外内存泄漏。

证实了下那时劳动进度的启动成就:

-Xms4g -Xmx4g -Xmn2g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 

天然今日莫得上线新代码,可是「今日上昼咱们正在使用音尘部队推送历史数据的建造剧本,该任务会多半调用咱们劳动其中的某一个接口」,是以初步怀疑和该接口估量。

下图是该调用接口今日的看望量变化:

 

不错看到案发那时调用量比较泛泛情况(每分钟200+次)普及了好多(每分钟5000+次)。

「咱们暂时让剧本罢手发送音尘,该接口调用量下跌到每分钟200+次,容器内存不再以极高斜率上升,一切似乎复原了泛泛。」

接下来排查这个接口是不是发生了内存泄漏。

排查过程

领先咱们先追念下Java进度的内存分拨,肤浅咱们底下排查思绪的弘扬。

「以咱们线上使用的JDK1.8版块为例」。JVM内存分拨网上有许多总结,我就不再进行二次创作。

测试中还使用了试验性质的DOCSIS 4.0模式的光纤同轴混合网络(HFC)。

虽然难以找到可靠的虚拟专用网络使用统计数据,但根据安全网站Security.org的估计,三分之二的美国人使用过虚拟专用网络,大约有3800万人经常使用虚拟专用网络。在新冠疫情期间,大量员工转向在家远程工作也显著增加了此类应用,68%的企业开始或增加了对此类服务的使用。

JVM内存区域的差异为两块:堆区和非堆区。

堆区:即是咱们熟知的更生代老年代。 非堆区:非堆区如图中所示,有元数据区和径直内存。

 

「这里需要特殊认确凿是:弥远代(JDK8的原生去)存放JVM运行时使用的类,弥远代的对象在full GC时进行垃圾收罗。」

温习结束JVM的内存分拨,让咱们回到故障上来。

堆内存分析

虽说一驱动就基本证实与堆内存无关,因为泄露的内存占用跨越了堆内存规矩4G,可是咱们为了保障起见先看下堆内存有什么痕迹。

咱们明察了更生代和老年代内存占用弧线以及回收次数统计,和往常一样莫得大问题,咱们接着在事故现场的容器上dump了一份JVM堆内存的日记。

堆内存Dump

堆内存快照dump敕令:

jmap -dump:live,format=b,file=xxxx.hprof pid 

画外音:你也不错使用jmap -histo:live pid径直检验堆内存存活的对象。

导出后,将Dump文献下载回腹地,然后不错使用Eclipse的MAT(Memory Analyzer)或者JDK自带的JVisualVM大开日记文献。

使用MAT大开文献如图所示:

 

「不错看到堆内存中,有一些nio估量的大对象,比如正在收受音尘部队音尘的nioChannel,还有nio.HeapByteBuffer,可是数目未几,不行看成判断的依据,先放着明察下。」

下一步,我驱动浏览该接口代码,接口里面主要逻辑是调用集团的WCS客户端,将数据库表中数据查表后写入WCS,莫得其他特殊逻辑

发觉莫得什么特殊逻辑后,我驱动怀疑WCS客户端封装是否存在内存泄漏,这样怀疑的事理是,WCS客户端底层是由SCF客户端封装的,看成RPC框架,其底层通信传输合同有可能会请求径直内存。

「是不是我的代码启航了WCS客户端的Bug,导致不断地请求径直内存的调用,最终吃满内存。」

我估量上了WCS的值班人,将咱们遭受的问题和他们姿色了一下,他们回答咱们,会在他们腹地推论下写入操作的压测,望望能不行复现咱们的问题。

既然恭候他们的响应还需要时候,咱们就准备先我方推敲下原因。

「我将怀疑的视力停留在了径直内存上,怀疑是由于接口调用量过大,客户端对nio使用不当,导致使用ByteBuffer请求过多的径直内存。」

「画外音:最终的后果讲解,这一个惟我独尊的思绪导致排查过程走了弯路。在问题的排查过程中,用合理的估量来收缩排查限制是不错的,但最佳先把每种可能性都列明晰,在发现我方潜入某个可能性无果时,要实时回头仔细扫视其他可能性。」

沙箱环境复现

为了能还原那时的故障场景,我在沙箱环境请求了一台压测机器,来确保和线上环境一致。

「领先咱们先模拟内存溢出的情况(多半调用接口):」

咱们让剧本陆续推送数据,调用咱们的接口,咱们连接明察内存占用。

当驱动调用后,内存便驱动连接增长,何况看起来莫得被规矩住(莫得因为规矩触发Full GC)。

 

「接着咱们来模拟下平时泛泛调用量的情况(泛泛量调用接口):」

咱们将该接口平时泛泛的调用量(比较小,且每10分钟进行一次批量调用)切到该压测机器上,取得了下图这样的须生代内存和物理内存趋势:

 

「问题来了:为何内存会不断往上走吃满内存呢?」

那时估量是由于JVM进度并莫得关于径直内存大小进行规矩(-XX:MaxDirectMemorySize),是以堆外内存不断高潮,并不会触发FullGC操作。

「上图简略得出两个论断:」

在内存泄露的接口调用量很大的时候,要是恰巧堆内须生代等其他情况一直动怒意FullGC条目,就一直不会FullGC,径直内存一齐高潮。 而在平时低调用量的情况下, 内存泄漏的比较慢,FullGC总会到来,回收掉泄露的那部分,这亦然平时莫得出问题,泛泛运行了很久的原因。

「由于上头提到,咱们进度的启动参数中并莫得规矩径直内存,于是咱们将-XX:MaxDirectMemorySize成就加上,再次在沙箱环境进行了教育。」

后果发现,进度占用的物理内存依然会不断高潮,超出了咱们确立的规矩,“看上去”成就似乎没起作用。

这让我很诧异,难道JVM对内存的规矩出现了问题?

「到了这里,简略看出我排查过程中思绪执着于径直内存的泄露,触物伤情了。」

「画外音:咱们应该深信JVM对内存的旁边,要是发现参数失效,多从我方身上找原因,望望是不是我方使用参数有误。」

径直内存分析

为了更进一步的侦查明晰径直内存里有什么,我驱动对径直内存下手。由于径直内存并不行像堆内存一样,很容易的看出统共占用的对象,咱们需要一些敕令来对径直内存进行排查,我有效了几种见解,来检验径直内存里到底出现了什么问题。

检验进度内存信息 pmap

pmap - report memory map of a process(检验进度的内存映像信息)

pmap敕令用于论说进度的内存映射关系,是Linux调试及运维一个很好的用具。

pmap -x pid 要是需要排序  | sort -n -k3** 

推论后我取得了底下的输出,删减输出如下:

.. 00007fa2d4000000    8660    8660    8660 rw---   [ anon ] 00007fa65f12a000    8664    8664    8664 rw---   [ anon ] 00007fa610000000    9840    9832    9832 rw---   [ anon ] 00007fa5f75ff000   10244   10244   10244 rw---   [ anon ] 00007fa6005fe000   59400   10276   10276 rw---   [ anon ] 00007fa3f8000000   10468   10468   10468 rw---   [ anon ] 00007fa60c000000   10480   10480   10480 rw---   [ anon ] 00007fa614000000   10724   10696   10696 rw---   [ anon ] 00007fa6e1c59000   13048   11228       0 r-x-- libjvm.so 00007fa604000000   12140   12016   12016 rw---   [ anon ] 00007fa654000000   13316   13096   13096 rw---   [ anon ] 00007fa618000000   16888   16748   16748 rw---   [ anon ] 00007fa624000000   37504   18756   18756 rw---   [ anon ] 00007fa62c000000   53220   22368   22368 rw---   [ anon ] 00007fa630000000   25128   23648   23648 rw---   [ anon ] 00007fa63c000000   28044   24300   24300 rw---   [ anon ] 00007fa61c000000   42376   27348   27348 rw---   [ anon ] 00007fa628000000   29692   27388   27388 rw---   [ anon ] 00007fa640000000   28016   28016   28016 rw---   [ anon ] 00007fa620000000   28228   28216   28216 rw---   [ anon ] 00007fa634000000   36096   30024   30024 rw---   [ anon ] 00007fa638000000   65516   40128   40128 rw---   [ anon ] 00007fa478000000   46280   46240   46240 rw---   [ anon ] 0000000000f7e000   47980   47856   47856 rw---   [ anon ] 00007fa67ccf0000   52288   51264   51264 rw---   [ anon ] 00007fa6dc000000   65512   63264   63264 rw---   [ anon ] 00007fa6cd000000   71296   68916   68916 rwx--   [ anon ] 00000006c0000000 4359360 2735484 2735484 rw---   [ anon ] 

不错看出,最底下一溜是堆内存的映射,占用4G,其他上头有极端多小的内存占用,不外通过这些信息咱们依然看不出问题。

堆外内存追踪 NativeMemoryTracking

Native Memory Tracking (NMT) 是Hotspot VM用来分析VM里面内存使用情况的一个功能。咱们不错诈欺jcmd(jdk自带)这个用具来看望NMT的数据。

NMT必须先通过VM启动参数中大开,不外要认确凿是,大开NMT会带来5%-10%的性能损耗。

-XX:NativeMemoryTracking=[off | summary | detail] # off: 默许关闭 # summary: 只统计各个分类的内存使用情况. # detail: Collect memory usage by individual call sites. 

然后运行进度,不错使用底下的敕令检验径直内存:

jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]   # summary: 分类内存使用情况. # detail: 详备内存使用情况,除了summary信息除外还包含了凭空内存使用情况。 # baseline: 创建内存使用快照,肤浅和背面做对比 # summary.diff: 和上一次baseline的summary对比 # detail.diff: 和上一次baseline的detail对比 # shutdown: 关闭NMT 

咱们使用:

jcmd pid VM.native_memory detail scale=MB > temp.txt 

取得如图后果:

 

上图中给咱们的信息,都不行很显著的看出问题,至少我那时依然不行通过这几次信息看出问题。

排查似乎堕入了僵局。

山重水复疑无路

在排查堕入停滞的时候,咱们取得了来自WCS和SCF方面的回答,「两方都详情了他们的封装莫得内存泄漏的存在」,WCS方面莫得使用径直内存,而SCF天然看成底层RPC合同,可是也不会留传这样显著的内存bug,否则应该线上有好多响应。

检验JVM内存信息 jmap

此时,找不到问题的我再次新开了一个沙箱容器,运行劳动进度,然后运行jmap敕令,看一看JVM内存的「践诺成就」:

jmap -heap pid 

取得后果:

Attaching to process ID 1474, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.66-b17  using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC  Heap Configuration:    MinHeapFreeRatio         = 40    MaxHeapFreeRatio         = 70    MaxHeapSize              = 4294967296 (4096.0MB)    NewSize                  = 2147483648 (2048.0MB)    MaxNewSize               = 2147483648 (2048.0MB)    OldSize                  = 2147483648 (2048.0MB)    NewRatio                 = 2    SurvivorRatio            = 8    MetaspaceSize            = 21807104 (20.796875MB)    CompressedClassSpaceSize = 1073741824 (1024.0MB)    MaxMetaspaceSize         = 17592186044415 MB    G1HeapRegionSize         = 0 (0.0MB)  Heap Usage: New Generation (Eden + 1 Survivor Space):    capacity = 1932787712 (1843.25MB)    used     = 1698208480 (1619.5378112792969MB)    free     = 234579232 (223.71218872070312MB)    87.86316621615607% used Eden Space:    capacity = 1718091776 (1638.5MB)    used     = 1690833680 (1612.504653930664MB)    free     = 27258096 (25.995346069335938MB)    98.41346682518548% used From Space:    capacity = 214695936 (204.75MB)    used     = 7374800 (7.0331573486328125MB)    free     = 207321136 (197.7168426513672MB)    3.4349974840697497% used To Space:    capacity = 214695936 (204.75MB)    used     = 0 (0.0MB)    free     = 214695936 (204.75MB)    0.0% used concurrent mark-sweep generation:    capacity = 2147483648 (2048.0MB)    used     = 322602776 (307.6579818725586MB)    free     = 1824880872 (1740.3420181274414MB)    15.022362396121025% used  29425 interned Strings occupying 3202824 bytes 

输出的信息中,看得出老年代和更生代都蛮泛泛的,元空间也只占用了20M,径直内存看起来亦然2g...

嗯?为什么MaxMetaspaceSize = 17592186044415 MB?「看起来就和没规矩一样」。

再仔细望望咱们的启动参数:

-Xms4g -Xmx4g -Xmn2g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 

成就的是-XX:PermSize=256m -XX:MaxPermSize=512m,也即是弥远代的内存空间。「而1.8后,性插久久Hotspot凭空机仍是移除了弥远代,使用了元空间代替。」 由于咱们线上使用的是JDK1.8,「是以咱们关于元空间的最大容量根柢就莫得做规矩」,-XX:PermSize=256m -XX:MaxPermSize=512m 这两个参数关于1.8即是逾期的参数。

底下的图姿色了从1.7到1.8,弥远代的变更:

 

「那会不会是元空间内存泄露了呢?」

我聘任了在腹地进行测试,肤浅鼎新参数,也肤浅使用JVisualVM用具直觉的看出内存变化。

使用JVisualVM明察进度运行

领先规矩住元空间,使用参数-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m,然后在腹地轮回调用出问题的接口。

取得如图:

 

「不错看出,在元空间奢靡时,系统启航了Full GC,元空间内存取得回收,何况卸载了好多类。」

然后咱们将元空间规矩去掉,也即是使用之前出问题的参数:

-Xms4g -Xmx4g -Xmn2g -Xss1024K -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 -XX:MaxDirectMemorySize=2g -XX:+UnlockDiagnosticVMOptions 

取得如图:

 

「不错看出,元空间在不断高潮,何况已装入的类跟着调用量的加多也在不断高潮,呈现正相干趋势。」

柳暗花明又一村

问题一下子开朗了起来,「跟着每次接口的调用,极有可能是某个类都在不断的被创建,占用了元空间的内存」。

明察JVM类加载情况 -verbose

在调试设施时,偶然需要检验设施加载的类、内存回收情况、调用的腹地接口等。这时候就需要-verbose敕令。在myeclipse不错通过右键确立(如下),也不错在敕令行输入java -verbose来检验。

-verbose:class 检验类加载情况 -verbose:gc 检验凭空机中内存回收情况 -verbose:jni 检验腹地循序调用的情况 

咱们在腹地环境,添加启动参数-verbose:class轮回调用接口。

不错看到生成了无数com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto:

[Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] [Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] [Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] [Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] [Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] [Loaded com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto from file:/C:/Users/yangzhendong01/.m2/repository/com/alibaba/fastjson/1.2.71/fastjson-1.2.71.jar] 

当调用了好屡次,蕴蓄了一定的类时,咱们手动推论Full GC,进行类加载器的回收,咱们发现多半的fastjson相干类被回收。

「要是在回收前,使用jmap检验类加载情况,相同也不错发现多半的fastjson相干类:」

jmap -clstats 7984 

 

这下有了标的,「此次仔细排查代码」,检验代码逻辑里那儿用到了fastjson,发现了如下代码:

/**  * 复返Json字符串.驼峰转_  * @param bean 实体类.  */ public static String buildData(Object bean) {     try {         SerializeConfig CONFIG = new SerializeConfig();         CONFIG.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;         return jsonString = JSON.toJSONString(bean, CONFIG);     } catch (Exception e) {         return null;     } } 

问题根因

咱们在调用wcs前将驼峰字段的实体类序列化成下划线字段,**这需要使用fastjson的SerializeConfig,而咱们在静态循序中对其进行了实例化。SerializeConfig创建时默许会创建一个ASM代理类用来收尾对方针对象的序列化。也即是上头被等闲创建的类com.alibaba.fastjson.serializer.ASMSerializer_1_WlkCustomerDto,要是咱们复用SerializeConfig,fastjson会去寻找仍是创建的代理类,从而复用。可是要是new SerializeConfig(),则找不到原本生成的代理类,就会一直去生成新的WlkCustomerDto代理类。

底下两张图时问题定位的源码:

咱们将SerializeConfig看成类的静态变量,问题取得了搞定。

private static final SerializeConfig CONFIG = new SerializeConfig();  static {     CONFIG.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; } 

fastjson SerializeConfig 做了什么SerializeConfig先容:

SerializeConfig的主邀功能是成就并记载每种Java类型对应的序列化类(ObjectSerializer接口的收尾类),比如Boolean.class使用BooleanCodec(看定名就知晓该类将序列化和反序列化收尾写到沿路了)看成序列化收尾类,float[].class使用FloatArraySerializer看成序列化收尾类。这些序列化收尾类,有的是FastJSON中默许收尾的(比如Java基本类),有的是通过ASM框架生成的(比如用户自界说类),有的致使是用户自界说的序列化类(比如Date类型框架默许收尾是转为毫秒,应用需要转为秒)。天然,这就波及到是使用ASM生成序列化类如故使用JavaBean的序列化类类序列化的问题,这里判拆除据即是是否Android环境(环境变量"java.vm.name"为"dalvik"或"lemur"即是Android环境),但判断不仅这里一处,后续还有更具体的判断。

表面上来说,每个SerializeConfig实例若序列化交流的类,都会找到之前生成的该类的代理类,来进行序列化。们的劳动在每次接口被调用时,都实例化一个ParseConfig对象来成就Fastjson反序列真实立,而未禁用ASM代理的情况下,由于每次调用ParseConfig都是一个新的实例,因此恒久也查验不到仍是创建的代理类,是以Fastjson便不断的创建新的代理类,并加载到metaspace中,最终导致metaspace不断推广,将机器的内存奢靡。

升级JDK1.8才会出现问题

导致问题发生的原因如故值得深爱。为什么在升级之前不会出现这个问题?这就要分析jdk1.8和1.7自带的hotspot凭空机的各异了。

从jdk1.8驱动,自带的hostspot凭空机取消了曩昔的弥远区,而新增了metaspace区,从功能上看,metaspace不错觉得和弥远区访佛,其最主要的功用亦然存放类元数据,但践诺的机制则有较大的不同。

领先,metaspace默许的最大值是统共这个词机器的物理内存大小,是以metaspace不断推广会导致java设施侵占系统可用内存,最终系统莫得可用的内存;而弥远区则有固定的默许大小,不会推广到统共这个词机器的可用内存。当分拨的内存奢靡时,两者均会触发full gc,但不同的是弥远区在full gc时,以堆内存回收时访佛的机制去回收弥远区中的类元数据(Class对象),只有是根援用无法到达的对象就不错回收掉,而metaspace判断类元数据是否不错回收,是凭据加载这些类元数据的Classloader是否不错回收来判断的,只有Classloader不行回收,通过其加载的类元数据就不会被回收。这也就解释了咱们这两个劳动为什么在升级到1.8之后才出现问题,因为在之前的jdk版块中,天然每次调用fastjson都创建了好多代理类,在弥远区中加载类好多代理类的Class实例,但这些Class实例都是在循序调用是创建的,调用完成之后就不可达了,因此弥远区内存满了触发full gc时,都会被回收掉。

而使用1.8时,因为这些代理类都是通过干线程的Classloader加载的,这个Classloader在设施运行的过程中恒久也不会被回收,因此通过其加载的这些代理类也恒久不会被回收,这就导致metaspace不断推广,最终奢靡机器的内存了。

这个问题并不局限于fastjson,只有是需要通过设施加载创建类的场所,就有可能出现这种问题。「尤其是在框架中,经常多半领受访佛ASM、javassist等用具进行字节码增强,而凭据上头的分析,在jdk1.8之前,因为大多数情况下动态加载的Class都简略在full gc时取得回收,因此辞谢易出现问题」,也因此好多框架、用具包并莫得针对这个问题做一些处理,一朝升级到1.8之后,这些问题就可能会暴流露来。

总结

问题搞定了,接下来复盘下统共这个词排查问题的经过,统共这个词经过显露了我好多问题,最主要的即是「关于JVM不同版块的内存分拨还不够练习」,导致了关于须生代和元空间判断空幻,走了好多弯路,在径直内存中排查了很久,浪费了好多时候。

其次,排查需要的「一是仔细,二是全面,」,最佳将统共可能性先行整理好,否则很容易堕入我方设定好的排查限制内,走进死巷子不出来。

终末,总结一下此次的问题带来的成绩:

JDK1.8驱动,自带的hostspot凭空机取消了曩昔的弥远区,而新增了metaspace区,从功能上看,metaspace不错觉得和弥远区访佛,其最主要的功用亦然存放类元数据,但践诺的机制则有较大的不同。

关于JVM里面的内存需要在启动时进行规矩,包括咱们练习的堆内存,也要包括径直内存和元生区,这是保证线上劳动泛泛运行终末的兜底。

使用类库,请多认真代码的写法,尽量不要出现显著的内存泄漏。

关于使用了ASM等字节码增强用具的类库,在使用他们时请多加提神(尤其是JDK1.8以后)。

参考明察设施运行时类加载的过程

blog.csdn.net/tenderhearted/article/details/39642275

Metaspace全体先容(弥远代被替换原因、元空间脾气、元空间内存检验分析循序)

https://www.cnblogs.com/duanxz/p/3520829.html

java内存占用特别问题常见排查经过(含堆外内存特别)

https://my.oschina.net/haitaohu/blog/3024843

JVM源码分析之堆外内存十足解读

http://lovestblog.cn/blog/2015/05/12/direct-buffer/

JVM 类的卸载

https://www.cnblogs.com/caoxb/p/12735525.html

fastjson在jdk1.8上头开启asm

https://github.com/alibaba/fastjson/issues/385

fastjson:PropertyNamingStrategy_cn

https://github.com/alibaba/fastjson/wiki/PropertyNamingStrategy_cn

警惕动态代理导致的Metaspace内存泄漏问题

https://blog.csdn.net/xyghehehehe/article/details/78820135

本文转载自微信公众号「后端本事座谈」,不错通过以下二维码关爱。转载本文请估量后端本事座谈公众号。