实际场景数据如下:
# jstat -gccause 73 3000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
20.38 0.00 84.24 40.49 94.09 89.96 1274 56.063 0 0.000 56.063 Allocation Failure No GC
jvm未发生过FGC;
# jstat -class 73
Loaded Bytes Unloaded Bytes Time
22893 42938.7 0 0.0 21.78
未出现类卸载(unloaded);
# jmap -histo 73 > jmap_histo_in_manual_0728_1.txt
# grep '24 Script' ./jmap_histo_in_manual_0728_1.txt
6289: 1 24 Script13
6290: 1 24 Script6
6291: 1 24 Script62
6292: 1 24 Script65
6293: 1 24 Script68
# grep 'GroovyClassLoader' ./jmap_histo_in_manual_0728_1.txt
439: 200 25600 groovy.lang.GroovyClassLoader$InnerLoader
1025: 201 3216 groovy.lang.GroovyClassLoader$1
3410: 1 112 groovy.lang.GroovyClassLoader
**********************************************
$ classloader
name numberOfInstances loadedCountTotal
org.apache.catalina.loader.ParallelWebappClassLoader 1 13815
BootstrapClassLoader 1 4142
com.yonyou.cloud.iceberg.LaunchedURLClassLoader 1 3422
sun.reflect.DelegatingClassLoader 1636 1636
com.taobao.arthas.agent.ArthasClassloader 1 1200
java.net.URLClassLoader 1 768
sun.misc.Launcher$AppClassLoader 1 373
groovy.lang.GroovyClassLoader$InnerLoader 200 200
com.yonyou.cloud.iceberg.HessianClassLoader 1 93
org.codehaus.groovy.runtime.callsite.CallSiteClassLoader 25 45
sun.misc.Launcher$ExtClassLoader 1 43
com.alibaba.fastjson.util.ASMClassLoader 2 19
org.codehaus.groovy.reflection.SunClassLoader 1 1
groovy.lang.GroovyClassLoader 1 0
Affect(row-cnt:14) cost in 50 ms.
************************************
# jmap -histo:live 73 > jmap_histo_in_manual_0728_2.txt
相当手动触发1次FGC
# jstat -gccause 73 3000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 0.00 5.94 32.46 94.04 89.74 1285 56.613 1 3.085 59.698 Heap Inspection Initiated GC No GC
# jstat -class 73
Loaded Bytes Unloaded Bytes Time
24149 45240.2 163 229.5 22.36
经过FGC后,开始出现类的元数据被unloaded掉了;
【分析】
通过arthas和jstat,可以看到groovy.lang.GroovyClassLoader$InnerLoader为200个,并且加载的类也是200个,此处加载的类就是Script<Number>,由Groovy运行期动态解析Script得到的类;
已知:Groovy动态加载Script类时,按每个Script对一个ClassLoader,即groovy.lang.GroovyClassLoader$InnerLoader,每加载一个Script<Number>,同时也生成一个GroovyClassLoader.InnerLoader类对象;
按此线索,java中Script<Number>类对象应该是200个,但是通过jmap -histo发现,该Script<Number>类对象仅5个,如下:
///////////begin////////
# grep '24 Script' ./jmap_histo_in_manual_0728_1.txt
6289: 1 24 Script13
6290: 1 24 Script6
6291: 1 24 Script62
6292: 1 24 Script65
6293: 1 24 Script68
//////////end////////////
说明:曾经解析得到的200个Script<Number>类对象,已被大部分回收,仅剩下5个了;
另一方面,通过jstat也发现在没有unloadded的类情况,heap中类对象已被回收了,
由此,得到结论:
1> heap中类对象是否被回收,仅与其引用有关,与该类对象的类元数据或者其classloader是否被卸载无关;
2> 相反,class是否被unloaded掉,是发生在类对象被GC之后的,即类对象被GC后,其相应的类元数据会被unloaded掉;
3> class被unloaded时机,发生在FGC时;
【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:
分享到:
相关推荐
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
groovy-loader load groovy scripts in file directory dynamically ...spring配置文件使用标签lang:groovy,通过指定script-source来加载指定路径下的groovy脚本,通过refresh-check-delay属性来定时
Groovy Script 入门 Groovy 脚本入门
groovy-loader-v2 load groovy scripts in file directory dynamically 简介 ...通过GroovyScriptFactory一级类加载器来实例化groovy脚本 通过扫描监听指定路径下groovy文件的变更,来接受groovy脚本的
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
groovy一般程序的script,适合Groovy初学者
JUN SpringBoot API Service 是一个基于SpringBoot+Groovy+SQL动态生成API并动态发布,且发布后可动态执行groovy脚本及SQL脚本的API服务项目。提供在线执行动态程序脚热加载本及动态生成API并执行的功能。支持动态...
java 动态脚本语言 精通 Groovy
问题原因分析:使用ScriptEngine.eval每次都会对脚本进行编译,生成一个新的类,被GroovyClassLoader加载,大量执行计算后,将导致被加载的类数量不断增加,最终OOM。 解决办法:对计算的表达式expression进行预...
groovy 敏捷 开发 动态 语言 急速 web 应用 开发
scala erlang groovy python 原理 比较 分析
通过groovy自定义函数实现提取明细表字段至主表字段,同时根据表单上的字段进行计算,将计算结果在字段上显示;致远、groovy
软件项目的可扩展性和动态维护性是非常重要的,例如在微服务的网关动态过滤器中,要实现过滤器的动态更新而不影响项目的持续运行,就需要借助groovy的动态编译功能,而这个功能是通过 .groovy文件实现的。...
NULL 博文链接:https://genius.iteye.com/blog/620029
自己总结的metaClass和ExpandoMetaClass的基本使用方法,代码量虽不到但是我觉得很有用处。
Groovy 是用于Java虚拟机的一种敏捷的动态语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多...
对javax.script包进行讲解,实现支持java动态嵌入执行groovy代码片段
groovy集成springboot 1.通过groovy文件执行脚本 2.通过数据库动态执行
Groovy in Action, Second Edition is the undisputed definitive reference on the Groovy language. Written by core members of the Groovy language team, this book presents Groovy like no other can—from ...
虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。) 许多 Java...