类加载过程:双 - 寄生约会机制:JVM启动时,扩展类加载程序将加载一个-case Sun.misc.launcher类。在启动器的构建方法中,将创建ExtClassLoader和AppClassLoader。其中,ExtClassLoaderParent是Bootstraploader.AppClassLoader是ExtClassLoader.jvm默认值以加载类AppClassLoader。当双利约会模型加载时,当AppClassloader加载类时,该类将移交给ExtClassLoader和ExtClassLoader,并将其移交给ExtClassLoader,并将如果成功加载了BootstrapLoader,则可以加载Bootstraploader的类,返回,然后将故障移交给Sub -Loader ExtClassLoader到LOAD.LOAD。按下,按下,完成加载。
通过源代码,双极分配:appclassloader.loadclass方法,parent class loadClass方法被调用:parent class classloader.loadclass方法:
“全部责任”是指当类加载类带有类时,除非明确配制另一个类加载程序,否则该类取决于该类及其引用,其引用由加载程序加载。
自定义类加载程序只需要继承java.lang.classloader类。该类有两种核心方法,一种是LoadClass(String,boolean),它实现了双极预约机制。另一种方法是FindClass。默认实现是一种空置方法。因此,我们主要自定义类加载程序以重写FindClass方法。
如果打破双极滚动,则只需重写LoadClass(String,Boolean)方法即可。您不先将课程加载到父级。
Tomcat打破了两个父母的分配tomcat以实现隔离,它不符合本协议。每个WebAppClassLoader都将类文件加载到其目录中,并且不会传递给Parent Loader,从而破坏双党分配机制。
JDBC打破两个 - 方连接类驱动程序通常由第三方实现,而驱动程序的加载在RT.JAR中使用。当此类是加载程序时,Bootstraploader无法在指定的三方库中加载类,因此JDBC使用Java SPI机械策划打破了双向约会模型。
内存参数:关于元空间有两个JVM参数:-xx:metAspaceSize = n and -xx:maxMetAspaceSize = n -xx:maxMetAspaceSize:设置默认空间的最大值,默认值是无限的,或者仅接受仅接受以限制为limimimplimpe本地内存大小。-XX:METASPACESIZE:指定元空间的初始阈值,以触发空间中FullGC(无固定初始大小)的初始阈值。通过字节,默认值为21m。当达到值的值时:如果释放大量空间,则该值会适当降低;如果空间很小,则该值在没有-XX的情况下适当增加:MaxMetaspaceSize(如果设置)。因为元空间的大小需要完整的GC,这是一个非常昂贵的操作。如果应用大量全GC时,则通常是由于调整元空间。基于这种情况,通常建议使用JVM Parameterset MetAspaceSize和MaxMetAspaceSize中的JVM参数中,并将其设置为初始值。对于8G物理记忆机,我通常将这两个值设置为256m。
堆栈参数设置:-XSS:设置线程堆栈的内存,默认为1M,当深递归时可能会触发stackoverflowerrororror。设置设置越小,可以在JVM中打开的线程数越多。
对象的内存分布方法是在加载类加载后确定的。这次,有必要分配其大小。
如何解决内存分布和并发的问题?
对象头:Java对象压缩的指针是什么?
对象内存分布过程的分布通过逃生分析堆叠,确定该方法将无法通过该方法访问,并且临时对象将分配在堆栈上,从而破坏了堆栈框架的堆栈,从而降低了堆栈的压力GC.ESCAPE分析:分析对象的动态范围。当该方法中定义对象时,它不会从返回值或参数中逃脱,那么可以在堆栈上分配对象。JVM可以通过打开逃生分析参数(-xx:+docapeanalysis)要优化对象的分布位置,以便通过标量替换将其优先列为堆栈(分配在堆栈上)。转移参数(-xx:-doescapeanalysis)。通过逃生分析通过外部访问访问,并且当对象可以进一步分解时,JVM将不会创建对象。取而代之的是,对象的成员的变量被替换为替换成员变量分配堆栈框架或寄存器上的空间,因此由于没有较大的连续空间,因此不会分配对象内存。标量替换参数(-xxx):+消除汇总),默认情况下JDK7之后将其打开。量和聚合:不能进一步分解量表的量,而Java的基本数据类型是标量(例如:INT,Long,Long和其他基本数据类型,和其他基本数据类型,和参考类型等)。此数量称为聚合。Java中的对象是一个步骤分解的聚合。
物体分配在伊甸园区域:在大多数情况下,将在新一代伊甸园中分配该对象(大型物体将直接分配给旧一代)。当伊甸园不足时,年轻的GC将被触发为释放空间。
年轻的GC:回收新一代垃圾更频繁,更快。可能的。
该物体将分配在伊甸园地区。当伊甸园区域不足时,将触发年轻的GC。99%的物体将被回收。因为新一代的大多数物体死于生命和垂死,生存时间非常短,因此JVM默认的伊甸园地区和幸存者地区8:1:1非常合适,非常合适,非常合适,非常合适,非常合适,非常合适,非常合适,非常合适。因此,伊甸园区域足够大,幸存者可以使用它。jvm默认此参数-xx:+useadaptivesizepolicy(默认开放),这将导致该8:1:1的比例自动更改。如果您不希望此比例更改,则可以设置参数-xx:-useadaptivesizepolicy
大对象是需要大量连续内存空间的对象(例如:字符串,数组).jvm参数-xx:PreteneIzeUthEthreshold可以设置大对象的大小。如果物体超过大小,它将直接进入旧一代,不会进入年轻一代。此参数仅在串行和parnew的两个收集器下才有效。例如,设置JVM参数:-xx:PretenuresizizizizizeThreshold = 1000000(单位为字节)-xx:+useserialgc,然后在下面执行第一个程序以找到该程序大物体直接进入年龄?避免效率,以避免分配内存时内存的复制操作。
现在,虚拟机使用收集和收集的想法来管理内存,在内存回收过程中必须识别哪些对象,应将其放置在新一代中,以及应将其放置在老年中。要执行此操作,虚拟机给出了每个物体都有一个物体年龄(年龄)计数器。如果物体在第一个小型GC之后出生和通过后仍然可以生存,并且可以由幸存者容纳,则将其移至幸存者空间,并将对象年龄设置为1.他被提升为老年。对象被提升为老年人的年龄阈值,可以通过参数-xx:maxteningthreshold设置。
当伊甸园区域不足时,将触发年轻的GC。目前,所有幸存的物体都将被移至空白的幸存者地区。年龄将从小到大到幸存者存在。当将其存储到50%时,幸存者年龄最大的年龄将直接放入老年。这一规则实际上希望那些长期生存的人将尽快进入老年人。通常在年轻的GC后触发动态年龄判断机制。
每当新一代年轻的GC时,JVM都会计算老年的剩余可用空间。老年人空间保证机制的机制:xx: - handlepromotionfailure“在保证机制中,JVM将确定可用空间是否大于先前的年轻GC。进入老年的平均大小后,如果它小于相同的大小,它将启动完整的GC.full GC不是OOM。如果未设置,则将直接启动完整的GC。
配置的目的是确定是否基于过去的GC平均值需要完整的GC。用于减少全GC的目的。
向对象添加参考计数器。每当有一个地方参考时,计数器都会添加1;当引用无效时,计数器减少1;在任何时候,计数器的对象是不可能的。此方法简单有效,但是当前主流虚拟机并未选择此算法来管理内存。主要原因是很难
以“ GC根”对象为起点,然后搜索从这些节点引用的对象。所找到的对象标记为非式式对象,其余的无符号对象是垃圾对象。
强有力的参考,软参考,弱参考,虚拟报价
该方法区域主要由无用的班级回收,因此如何判断班级是没有用的?班级需要同时满足以下3个条件才能被视为“无用的班级”:
当代理论的集合JVM使用世代收集的思想将其划分为新一代和老一代,并根据每个时代的特征收集垃圾收集。例如,年轻一代,大多数物体死于生命。每次回收GC时,都会回收大量垃圾物体。只有少量的物体存活,因此它适用于使用标记拷贝算法进行垃圾收集。在老年中,大多数是长期生存的目标。每个GC仅恢复了少量的垃圾对象,因此适合使用标记清除/标记算法。复制算法。
副本算法将内存分为相同大小的两个空间,每个空间都使用其中一个。使用此内存后,将存储的对象复制到内存中间的另一个内存,并将原始内存块倒空这样,每个内存恢复是内存间隔的一半,并具有内存整理功能。
标记算法是生存和回收未签名对象的标记对象。有两个明显的问题:
根据专门由老年特征制定的标签算法,标记过程仍然与“标记回顾”算法相同,但是随后的步骤并未直接回收可回收物体,但让所有幸存的物体移动到一端,然后清楚地直接清理。
如果垃圾收集算法是一种用于内存回收的方法,则垃圾收集器是内存恢复的特定实现。尽管我们比较每个收集器,但还没有选择一个最佳的收藏家。目前,迄今为止,没有最好的垃圾收集器,并且还没有最好的垃圾收集器,并且没有通用的垃圾收集器。我们可以做的是根据特定的应用程序方案选择一个适合您的垃圾收集器。imagine:如果有一个完美的收藏家,该收集器适用于四个海洋和任何场景,那么我们的Java虚拟机将无法实现这么多的成就不同的垃圾收集器。
串行(串行)收集器是最基本和最古老的垃圾收集器。它是一个单线收集器。收集器将使用单线线程进行垃圾收集,并且在垃圾收集期间,所有应用程序线程将停止,即STW(也就是STW(停止世界),直到垃圾收集完成为止。新一代采用了标记复制算法,而旧一代使用Mark-Organizational算法。虚拟机的设计师肯定知道停止带来的不良用户体验世界,因此在随后的垃圾收集器设计中不断缩短(仍然停顿,寻找最佳垃圾收集器的过程仍在继续。但是连环收集器是否比其他垃圾收集器更好?与其他收藏家的单个线程相比)。串行收集器自然可以获得高单线收集效率,因为没有线程相互作用。Al Old Collector是串行收集器的旧版本,它也是一个单个收集器。它有两个主要用途:一个用于JDK1.5中的使用,而先前的版本则具有平行的清除收藏家,而另一个是储备CMS收集器的解决方案。
并行垃圾收集器实际上是串行的多线程版本。除了将多线程用于垃圾收集外,其余的行为(控制参数,收集算法,回收策略等)与串行收集器相似。默认集合中的线程数与CPU Core相同。当然,您还可以指定具有参数(-xx:ParallelGcThreads)的收集线数量,但通常不建议修改。平行的清除收集器的注意点是吞吐量(使用CPU高效率)。垃圾收集器(例如CMS)的注意力更多的是用户线程的停顿(改善用户体验)。所谓的吞吐量是在CPU中运行用户代码以使用CPU运行总耗时的时间的比率。并行清除收集器提供许多参数为了让用户找到最合适的暂停或最大吞吐量。如果您对收集器的操作了解不多,则可以选择优化虚拟机的内存管理以完成它。这也是一个不错的选择。新一代采用了复制算法,而老年则使用了标记组织算法。平行的旧收藏家是平行的清除收藏家的旧版本。使用多线程和“标签”编程”在关注吞吐量和CPU资源的情况下,您可以优先考虑平行的清除收藏家和并行的旧收藏家(JDK8的默认新一代和较旧的收藏家)。
Parnew收集器实际上与并行收集器非常相似。区别在于它可以与CMS Collector一起使用。这是在服务器模式下运行的许多虚拟机的主要选择。除串行收集器外,只有它可以与CMS收集器(实际意义上的真实并发收集器)一起使用,稍后将介绍)。
CMS是老年使用的垃圾收集器,使用标记清晰的算法。它是一个针对最短停顿时间的收集器,注意用户体验,并减少垃圾回收时的连续STW时间。整体上分为五个步骤:
据其名称,可以看出它是一个出色的垃圾收集器,具有主要优势:并发收集和低站点,但是它具有以下明显的缺点:
CMS核心参数:
在并发标记过程中,多标记的浮动垃圾,如果由于该方法的结束而破坏了某些局部变量(GCRoot),则该GCRoot引用的对象先前已被扫描(标记为非式物体对象),因此,这一轮GC不是记忆的一部分,这将被回收。该记忆的一部分本应被恢复但未恢复的记忆称为“漂浮垃圾”。浮动垃圾不会影响垃圾回收的正确性,但仅需要它等待直到下一轮垃圾回收被清除。此外,对于并发标记(和并发清洁)开始后生成的新对象,通常的方法将直接用作黑色,并且该回合将无法清除。物体的这一部分也可能变成垃圾,这也是浮动垃圾的一部分。
宽阔的阅读和写入屏障泄漏将导致引用的对象被垃圾删除。这些是严重的错误,必须解决。有两种解决方案:增量更新和原始快照(开始时快照(SATB)。incremental更新是当黑色对象插入新点与白色对象之间的参考关系时,记录对此新插入的引用,等待并发扫描,然后将这些记录的参考关系中的黑色对象植根,然后re -re -re -re -re -s -Scan.scan.scan一次。白色对象,它变成灰色对象。原始快照是当灰色对象想要删除与白色对象的参考关系时,在并发扫描后记录对已删除的参考的引用,然后在这些记录的参考中中的灰色对象在这样的关系中,您可以扫描白对象并将白对象直接标记为黑色(目的是允许该物体在这一轮GC清理中生存,并扫描下一个ROGC的UND。该对象也可能浮动。键盘)无论是在上面的参考关系记录中插入还是删除,虚拟机的记录操作都是通过编写障碍来实现的。
现代跟踪类型的垃圾回收(可用分析)几乎借用了三种颜色标记的算法思想。)灰色收集可以通过堆栈/队列/缓存日志等实现,可以遍历/深度遍历遍历,等等。对于阅读和写作障碍,以Java Hotspot VM为例。标记时错过的标签的处理方案:CMS:写障碍 +增量更新G1,Shenandoah:写障碍 + SATB ZGC:阅读障碍
为什么G1使用SATB?CMS会增加?我的理解:SATB的相对增量更新效率将很高(当然,SATB可能会导致更多的浮动垃圾),因为您无需在RE期间深入扫描已删除的参考对象- 标记阶段,将完成CMS的CMS的根对象。G1的成本将高于cms.gc,深入扫描。
新一代GCRoots扫描期间,内存收集和卡表可能会遇到跨代参考对象。这太低了,无法在老年中再次扫描扫描。为此,可以在新一代中引入“记忆集”的数据结构(从非收集区域记录到收集区域),以避免添加GCRoots扫描整个旧一代范围。实际上,这不仅是新一代与老年人之间的跨代引用。所有参与某些区域收藏(部分GC)行为的垃圾收集者,例如G1,ZGC和Shenandoah收集器,都会面对相同的收藏家,所有这些都面临着相同的要求。在垃圾收集方案中,收藏家只需要确定是否存在通过内存收集到收集区域中的指针,并且无需了解交叉代码的所有细节。HotsPot使用一种称为“ CardTable”的方法来实现内存收集,这也是最常用的方法。卡表和内存收集之间的关系,hashmap和Map中的Java语言之间的关系可以类似。卡表是使用字节数组:card_table []实现的,每个元素对应于内存区域的内存区域的特定大小,称为“卡页”。热点使用的卡页为2^9尺寸,即,一个卡页面的512字节可以包含多个对象。只要有一个带有对象字段的跨代指针,相应的卡表的元素徽标就会变为1,表明它意味着该元素变脏,否则在0。GC时,只需屏蔽卡表中的肮脏元素在此收集区域并添加GCRoots。已经说过卡片表的维护卡表,但是有必要知道如何使卡表肮脏,也就是说,当参考字段分配发生时, 如何更新卡片表的相应识别,因为1.HOTSPOT使用障碍来维护卡表状态。
G1(垃圾 - 首先)是一个面向服务器的垃圾收集器,主要针对配备多个处理器和大容量内存的机器。在满足GC暂停要求的可能性很高的同时,它也具有很高的吞吐量性能特征。G1将Java堆划分为具有相等大小的多个独立区域(区域),JVM最多可以具有2048个区域。该区域等于2048年的大小。例如,如果堆的大小为4096m,则区域大小为2m。当然,手动指定参数“ -xx:g1heapnepionsizizizizizizizizizizizizizizizizizizizizizize”,但建议使用默认计算方法。G1保留了年轻和老一辈的概念,但它不再是物理障碍。它们都是(可能是不连续的)集合。年轻一代与堆存储器的比例为5%。如果堆的大小为4096m,那么年轻一代的内存约为200MB,相应的区域约为100个区域。您可以通过“ -xx:g1newsizepercent”设置新一代的初始比例。在系统操作中,JVM将继续为年轻一代增加更多区域,但新一代的最大比例将不超过60%。可以通过“ -xx:g1maxnewsizepercent”进行调整。与年轻一代中的伊甸园和幸存者相对应的地区也与以前相同。默认值为8:1:1。假设年轻一代现在有1,000个区域,伊甸园区域对应于800,S0对应于100,而S1对应于100.a区域,则可能是年轻一代。如果区域进行了垃圾回收,则可能会变成一代,这意味着该地区的区域功能可能会动态变化。
当G1垃圾收集器(将物体转移到旧一代时,相同的原理都相同。唯一的区别是大型对象的处理。G1的区域具有专门从事大物体的区域。例如,根据上述情况,每个区域为2m。只要一个大物体超过1m,它就会放入杂音中。如果大物体太大,它可能会在多个地区存储。人类地区专门存储在短期巨型物体中。如果没有直接进入旧一代,他们就可以为老年人节省空间,并避免在老年中没有足够空间的GC开销。除了收集全GC时,还可以收集年轻人和老式时,还可以回收巨大的地区。
第一个GC处G1收集器的操作过程大致分为以下步骤:
G1收集器在后台维护优先级列表。每次根据允许的收集时间,您都会选择恢复最回收的区域(这是其名称垃圾 - 先生的起源)。另一个地区花费50ms可以回收200M垃圾。当回收时间有限时,G1当然将优先考虑后来的区域回收。该区域记忆空间和具有优先级的区域回收方法确保G1收集器可以在有限的时间内收集尽可能高的效率。
G1被认为是JDK1.7或更高以上的Java虚拟机的重要进化特征。它具有以下特征:
毫无疑问,用户指定期望的停顿是G1收集器的强大函数。设置对停顿的不同期望,以便G1可以在不同应用程序方案中不同应用程序方案中的吞吐量和延迟之间获得最佳平衡。EssenceHowever,此处设置的“期望值”必须与现实一致,并且它不能异想天开。毕竟,G1必须冻结用户线程复制对象。无论此停顿多么低,都必须有一个限制。默认暂停目标是200毫秒。一般来说,回收阶段将数十万到100甚至200毫秒的阶段是正常的,但是如果我们将其调整得非常低,例如,将其设置为20毫秒,则将其设置为20毫秒。结果可能会出现的结果是,目标时间太短了,这会导致恢复设置仅占据一小部分桩。首先,但是应用程序运行时间还不够。最后,造成了整个堆。两百毫秒或两三百毫秒会更合理。
G1垃圾收集分类
G1收集器参数设置
G1垃圾收集器优化建议和ENT;&ent;假设参数-XX:MAXGCPAUSEMILS设置很大,导致系统操作很长时间。年轻一代可能占据堆的60%。目前,触发了年轻一代GC。 然后可能有很多生存的物体。目前,这将导致幸存者地区无法放置这么多物体,并且会进入老年。 或者在您年轻之后,有太多的物体生存了,这会导致进入幸存者地区的动态年龄判断规则,达到幸存者地区的50%,并迅速导致一些进入老年的物体。 因此,核心是调整法规-XX:MAXGCPAPEMILLS的参数的参数值。在确保他的年轻一代GC过于频繁的同时,您必须考虑每次GC之后的生存物体多少,并避免过多的生存对象。经常进入老年,经常触发混合GC。
什么场景适合使用G1
如何优化JVM  KAFKA类似的支持高征收系统每秒每秒每秒每秒。用于支持高并发处理。该地区的年轻GC很快。在这种情况下,其执行会很快吗?显然,这是不可能的,因为内存太大,需要大量时间来处理它。假设30或四十g的回收可能需要几秒钟,请按Kafka的并发性。这可能是一两分钟,这意味着整个系统每次运行几秒钟都不会处理新的新闻。显然,这显然不好。因此,如何优化这种情况,我们可以使用G1收集器将-XX:MAXGCPAUSEMILS设置为50ms。假设50ms可以恢复三到四个G内存,然后可以完全接受50ms的纳托。用户几乎是未知的。然后,整个系统可以在处理业务的同时收集垃圾。 G1天生适合这台大型内存机的JVM操作,这可以完美地解决过长的记忆浪费回收时间的问题。
ZGC是JDK 11中新添加的实验性低删除垃圾收集器。可以说ZGC是从Azul System开发的C4(并发连续压实收集器)收集器中得出的。
如下图所示,ZGC的主要目标主要是:
ZGC不划分单代,即ZGC“没有一代。”我们知道,以前的垃圾回收设备被分为“大多数对象死亡并死亡”的假设的原因。实际上,大多数系统对象分布行为确实符合此假设。那么,为什么ZGC几代人区分?由于该部门的麻烦,作者首先意识到了一个相对简单且可用的单个版本,将来将在将来进行优化。
ZGC收集器是基于区域的内存布局。目前,没有离婚。它使用诸如障碍之类的技术来读取障碍物和颜色指针,以实现复杂的标记 - 组织algorithm.instrument.zgc的区域,可以具有大,中和小容量,如图3-19所示:
颜色指针彩色指针,即颜色指针,如下图所示,ZGC的核心设计之一。先前的垃圾回收器的GC信息存储在对象头中,ZGC GC信息存储在中指针。每个对象具有64位指针,这些64位分为:
为什么在每个GC周期开始时都会有2个标记?将交换标记位置,以便在GC周期中校正的标签状态将失败,所有参考都不会签名。GC循环1:使用Mark0,然后是周期结束所有引号标记标记将变为01.GC周期2:使用Mark1,然后是预期的标记10,所有参考都可以重新标记。从配置ZGC之后的对象指针的分析,我们可以看到对象指针必须为64位,然后ZGC不能支持32 -BIT操作系统,并且相同的功能可以支持压缩指针(压缩机,压缩指针也为32-bit)。
颜色指针的三个优点:
ZGC的操作过程可以大致分为以下四个主要阶段:
ZGC的问题:  ZGC的最大问题是浮动垃圾。ZGC的停顿低于10ms,但ZGC的执行时间远远大于此时间。如果在此期间需要执行ZGC的整个过程,则需要执行10分钟。对象的分布速率,将创建大量新对象。这些对象很难进入GC,因此只能在下一个GC上回收。扫描,导致一些“死亡和死亡死亡”的物体未能及时回收。
解决方案:目前,唯一的方法是增加大量堆的容量,以便该程序获得更多的呼吸时间,但这也是治愈标准的解决方案。如果您需要从根本上解决此问题,那么您仍然需要介绍集聚的集合,以便在专业区域中创建新目标,然后特别频繁,更快地收集该区域。
安全点:指代码中的某些特定位置。当线程运行到这些位置时,其状态是确定的,因此JVM可以安全操作安全需要等待所有线程运行,直到安全点为止。这些特定的安全点主要是:
使用JPS查看申请过程。
此命令可以查看内存信息,示例数量和内存大小
您可以使用JVisualVM命令工具引入转储文件分析
检查运行Java应用程序的扩展参数。查看JVM的参数:查看Java系统参数:
JSTAT命令可以查看堆内存的每个部分和加载类的数量。该命令的格式如下:
注意:使用的JDK版本是JDK8
年轻GC的触发频率和耗时的时间来知道年轻一代的增长率可以推动以计算在伊甸园地区计算的年轻GC多长时间。我们可能知道系统会被卡住多长时间执行年轻GC。
每次您每5分钟都知道年轻GC的频率时,有多少个物体生存并进入年龄,然后您可以执行命令JSTAT -GC PID 300000 10每5分钟。老年使用的变化通常会减少在每个GC之后,以及幸存者和老年都可能增长。这些生长对象是每个年轻GC后生存的物体。同时,可以看出,每个时间都在年轻的GC之后的旧一代,因此可以计算旧一代的增长率。
全GC的触发频率和老年年龄的时间消耗可以计算为完整GC的触发频率。全GC的时间消耗可以通过Formula FGCT/FGC计算。
实际上,优化的想法只是试图在每个年轻的GC之后使生存对象不到幸存者区域的50%,并且有年轻的一代。试图不让物体进入老年人。尽可能避免全GC对JVM性能的影响。
Arthas是2018年9月Alibaba开源的Java诊断工具。使用命令行交互式模式,可以轻松地定位和诊断在线程序操作问题。
Arthas使用:
您可以使用Java -Jar运行。您可以识别机器上的所有Java进程(我们之前已经运行了Arthas测试程序,请参见下面的代码)输入进程编号。详细查看线程。输入线程和线程ID。查看线程堆栈输入线程-b。您可以查看线程锁定输入Jad Plus类的全名。检查在线代码是否是正确的版本。使用OGNL命令查看在线系统变量的值,甚至修改变量的值
原始:https://juejin.cn/post/7101970284957138975
