【技术方案】深度分析打印日志为啥要使用占位符

背景:

最近项目上,关于是否使用占位符有不同的意见,尤其是以前使用字符串拼接的,觉得挺好的,没啥问题,为啥使用占位符,然后,他们在网上还找了一篇专门做性能比对的,主要针对的速度,文章里面测试了速度,速度有提高,但是说影响不大。

个人意见:

针对这种说法,以及网上一些粗制滥造的文章,我觉得有必要纠正一下

使用占位符不仅仅是速度提升的问题,主要是性能提升,节省内存,举例说明:

1.如果日志级别是info,那么debug级别的日志,占位符不会进行拼接,不会占据更多内存,但是字符串拼接却是直接拼接了,内存升高,如果打印的对象比较大,日志量多,内存很容被吃爆的

2.如果都是info级别日志,字符串拼接会不断的新增string对象,导致内存上升,占位符的话,只是替换内容,对象只新增一个,相对来说占用的内存少

原理分析

在这里不做速度方面的测试,我们只看看占位符在什么时间进行拼接,下面是以logback为例的:

首先进入代码:

【技术方案】深度分析打印日志为啥要使用占位符_第1张图片

红线标注的是项目设置的日志级别跟你需要打印的日志级别的比较,比如:你设置的是info,打印的是debug,那么到这里直接就返回了

buildLoggingEventAndAppend方法是继续往下走

继续往下走:

【技术方案】深度分析打印日志为啥要使用占位符_第2张图片

OutputStreamAppender这个类的subAppend方法是输出信息,它会调用prepareForDeferredProcessing方法,然后在输出流

下面看下prepareForDeferredProcessing方法:

【技术方案】深度分析打印日志为啥要使用占位符_第3张图片这个红线的方法是拼接占位符

一直往下走:

【技术方案】深度分析打印日志为啥要使用占位符_第4张图片

这个方法是进行占位符拼接的,根据代码我们可以看出,占位符只是替换内容,对象只新增了一个

结论:

打印日志使用占位符相对来说,节省内存,提升性能

你可能感兴趣的:(java)