Об утечке памяти log4j2, когда я вызываю исключение при запуске весенней загрузки - PullRequest
0 голосов
/ 02 июля 2018

ENV:
Пружинный ботинок 1.5.9. ВЫПУСК
spring-boot-starter-log4j2 (Is Log4j 2.7 версия)

Размер всей выходной информации составляет 9 КБ, включая весь вывод пружинной загрузки

А это моя конфигурация log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Properties>
        <Property name="pid">???</Property>


        <Property name="logPattern">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:pid}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>


        <Property name="fileLogPattern">%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n\n</Property>


        <Property name="logPath">/data/server/tomcat/logs/bbPurchaseAgency</Property>

        <!-- for SizeBasedTriggeringPolicy, this is the problem, but I need file split function -->
        <Property name="fileSplitSize">2KB</Property>


        <Property name="fileSplitTime">1</Property>

        <Property name="maxSurviveTime">30d</Property>
    </Properties>

    <Appenders>
        <Console name="developLog" target="SYSTEM_OUT" follow="true">
            <PatternLayout charset="${encoding}" pattern="${logPattern}"/>
            <ThresholdFilter level="info" onMatch="accept" onMismatch="deny"/>
        </Console>


        <RollingFile name="infoFile" fileName="${logPath}/bbPurchaseAgency_info.log"
                     filePattern="${logPath}/bbPurchaseAgency_info_%d{yyyy-MM-dd}-%i.log">
            <PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
                <SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
            </Policies>
            <Filters>

                <!-- this filter will be print all information whatever level it is -->
                <ThresholdFilter level="info" onMatch="accept" onMismatch="deny"/>
                <ThresholdFilter level="error" onMatch="deny" onMismatch="neutral"/>
                <ThresholdFilter level="warn" onMatch="deny" onMismatch="neutral"/>
            </Filters>
            <DefaultRolloverStrategy>
                <Delete basePath="${logPath}" maxDepth="1">
                    <IfFileName glob="bbPurchaseAgency_info_%d{yyyy-MM-dd}-%i.log" />
                    <IfLastModified age="${maxSurviveTime}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>


        <RollingFile name="warnFile" fileName="${logPath}/bbPurchaseAgency_warn.log"
                     filePattern="${logPath}/bbPurchaseAgency_warn_%d{yyyy-MM-dd}-%i.log">
            <PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
                <SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
            </Policies>
            <Filters>

                <ThresholdFilter level="error" onMatch="deny" onMismatch="neutral"/>
                <ThresholdFilter level="warn" onMatch="accept" onMismatch="deny"/>
            </Filters>
            <DefaultRolloverStrategy>
                <Delete basePath="${logPath}" maxDepth="1">
                    <IfFileName glob="bbPurchaseAgency_warn_%d{yyyy-MM-dd}-%i.log" />
                    <IfLastModified age="${maxSurviveTime}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>


        <RollingFile name="errorFile" fileName="${logPath}/bbPurchaseAgency_error.log"
                     filePattern="${logPath}/bbPurchaseAgency_error_%d{yyyy-MM-dd}-%i.log">
            <PatternLayout charset="${encoding}" pattern="${fileLogPattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="${fileSplitTime}"/>
                <SizeBasedTriggeringPolicy size="${fileSplitSize}"/>
            </Policies>
            <Filters>

                <ThresholdFilter level="error" onMatch="accept" onMismatch="deny"/>
            </Filters>
            <DefaultRolloverStrategy>
                <Delete basePath="${logPath}" maxDepth="1">
                    <IfFileName glob="bbPurchaseAgency_error_%d{yyyy-MM-dd}-%i.log" />
                    <IfLastModified age="${maxSurviveTime}"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>
        <AsyncLogger name="com.baibu.purchaseAgency" level="info" includeLocation="false">
            <AppenderRef ref="infoFile"/>
        </AsyncLogger>

        <AsyncLogger name="com.baibu.purchaseAgency" level="warn" includeLocation="true">
            <AppenderRef ref="warnFile"/>
        </AsyncLogger>

        <AsyncLogger name="com.baibu.purchaseAgency" level="error" includeLocation="true">
            <AppenderRef ref="errorFile"/>
        </AsyncLogger>

        <Root level="info">
            <AppenderRef ref="developLog"/>
            <AppenderRef ref="infoFile"/>
            <AppenderRef ref="warnFile"/>
            <AppenderRef ref="errorFile"/>
        </Root>
    </Loggers>
</Configuration>

Итак, вот вопрос:

Когда я активирую пружинную загрузку и тестирую, вызывая исключение, log4j2 печатает что-то и вызывает исключение, которое я создаю, И ПОТОМ пружинная загрузка не может остановиться из-за утечки памяти в log4j2.

Это тестовый код:

@Value( "${spring.datasource.url}" )
    public void checkDataSource( String url ) {
        logger.warn( "warning url" );
        logger.error( "error url" );
        Integer.parseInt( url );  // I raise an exception when spring boot starting
    }

И это информация стека:

The web application [ROOT] appears to have started a thread named [Log4j2-TF-4-1a752144-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
 java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
 java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
 java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 java.lang.Thread.run(Thread.java:745)

И я запускаю другой тест, такой как закрытие функции разделения файлов (установите для fileSplitSize значение 512 МБ), или делаю это:

    @Value( "${spring.datasource.url}" )
    public void checkDataSource( String url ) {
    new Thread( new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep( 10 * 1000 );

            } catch ( InterruptedException e ) {
                e.printStackTrace();
            }

            System.exit( 0 );
        }
    } ).start();
}

Ничего не происходит, все хорошо, утечки памяти нет ...

Также я вижу это описание на веб-сайте log4j2 (http://logging.apache.org/log4j/2.x/manual/webapp.html):

Во избежание проблем отключение Log4j будет автоматически отключено, если в него включен jar-файл log4j.

Я сделал это, но не работает.

В gitHub Log4j2 нет проблем, и в Интернете мало информации об утечке памяти log4j2. Может, кто-нибудь подскажет, как решить эту проблему? СПАСИБО ОЧЕНЬ МНОГО!

...