北京软件斥地公司log4j 2.6免垃圾汇集,Java措辞中风行的日志库Log4j的较新版本Log4j 2.6,将引入一系列选项以运行在免垃圾收受领受模式。该发布继续跟畴前几个发布版,考试考试晋升日志库的机能,而且已获得业界的积极响应。据机能改良倡议的指导者Remko Popm吐露,下一步将会增添log4j可以运行在免垃圾收受领受模式的场景数目。
2014年7月,log4j 2.0在日志框架规模革命性地引入了异步记实器,对比于同步记实器将吞吐率晋升了6至68倍。这些功能可能令人影响深切,但日志框架的机能耗损仍然据有了部门高吞吐率、低延时操作响应时刻的很除夜一部门,这经常导致斥地者在放置时消弭日志框架。对高机能操作法度楷模进行微调以避免垃圾收受领受导致的暂停能够达到很是好的下场,log4j团队剖断这些机能晋升能够带来更多的用户。经由过程机能和Java专家Kirk Pepperdine的评论来剖断,该假定是成立的:
Java中的日志框架形式不容乐不美不美观。到今天为止,我很少碰着客户反馈他们的系统没有因为日志框架导致的负面影响。我与到的一个极端例子是,一个客户面临4.5秒的时限,可是日志记拭魅占用了其中的4.2秒(很除夜一部门压力来自于异步追加器)。我将对次版本发布很是感欢兴奋乐喜爱。
避免垃圾收受领受是经由过程避免建树姑且对象来实现的,这意味着需要尽可能的复用已存在的对象。可是在较初发布的时辰,全数库没有能够做到免垃圾收受领受,是以斥地者假定但愿实现该功能,需要寄望追加器(appenders)、日志记实器(loggers)、名目化结构(formatting layouts)和API操作时的限制。
操作法度楷模类型
部门被复用的对象保留在ThreadLocal区域中。这样的设计对自力的操作法度楷模来讲没有问题,可是对web操作可能会激发内存泄露。操作处事器可能会将ThreadLocal保留在线程池中,这意味着即便当用被卸载,用于日志记实的对象仍然会连结援引。是以,经由过程ThreadLOcal来复用对象的功能在web操作法度楷模中默许是封锁的,既log4j没法完全运行在免垃圾收受领受模式。
日志记实器
log4j避免触发垃圾收受领受的此外一个体例是在将文本转换为字符数组的时辰复用缓冲区。所有类型的操作法度楷模都可是以受益,且该功能默许是开启的。可是操作同步日志记实器的多线程操作法度楷模可能会有机能影响,因为不合的线程需要竞争共享的缓冲区。假定碰着这类气象,理当优先操作异步日志记实器,或禁用共享缓冲区。
追加器
只有部门追加器已改削以避免建树姑且对象:Console(节制台)、File(文件)、RandomAccessFile(随机访谒文件)、上述追加器的回卷追加器、MemoryMappedFile(内存映照文件)。任何其他追加器城市发生垃圾,而且需要被收受领受。可是需要寄望的是,这些追加器自己可以避免垃圾收受领受,仍然会有其他I/O相关的成分会影响它们的机能。
名目化结构
名目化结构多是斥地者在试图设置设备放置达到免垃圾收受领受时较毒手的部门,因为他们不单需要关注所需操作的结构,还需要关注结构中的选项。GelfLayout(Graylog Extended Log Format)结构只有在缩短选项禁用时才撑持免垃圾收受领受,而PatternLayout只撑持限制的转换模式,任何其他转换模式城市建树姑且对象。
API操作
API自己也已为避免建树姑且对象而改削。除之前撑持简单可变长度参数(这样会建树一个姑且数据)的编制以外,log4j新增了所有编制的重载版本,较多撑持10个参数。挪用编制超越10个参数仍然会操作可变长度参数,这将会建树姑且数组。
这个限制对经由过程SLF4J操作log4j的场景影响较除夜,因为这个门面库只供给了较多两个参数的非变长参数。用户假定但愿操作超越两个参数,并运行在免垃圾收受领受模式,就需要丢弃SLF4J。
对代码的影响
当然已做了向下兼容,以避免斥地者更新代码,有一类姑且对象的建树和log4j框架自己无关:对根底数据类型的自动装箱。为了确保JVM不将根底数据类型装换成对应的对象,斥地者在给log4j传递根底数据类型时,可操作静态编制Unboxer.box()。该编制可以准予log4j直接措置根底数据类型而无需建树不需要的对象。
当然有一系列的限制前提,这些改变已有潜力在严酷机能需求的场景下显著晋升日志记实的体验。那些因为当前限制没法操作免垃圾收受领受特点的斥地者,可以继续关注变换列表,在未来的发布版本中可能会供给进一步的改良。