Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除Java记录器_Java_Logging_Memory Leaks - Fatal编程技术网

如何删除Java记录器

如何删除Java记录器,java,logging,memory-leaks,Java,Logging,Memory Leaks,我有一个应用程序内存泄漏,它创建了许多java.util.logging.Logger对象,我能够将问题归结为以下几点: import java.util.logging.Logger; public class LoggerTest { public static void main(String[] args) throws Exception { new LoggerTest().createManyLoggers(); } public

我有一个应用程序内存泄漏,它创建了许多java.util.logging.Logger对象,我能够将问题归结为以下几点:

import java.util.logging.Logger;

public class LoggerTest
{
    public static void main(String[] args) throws Exception
    {
        new LoggerTest().createManyLoggers();
    }

    public void createManyLoggers() throws Exception
    {
        System.out.println(generateMemoryStatus("before"));

        for (int i = 0; i < 100000; i++)
        {
            Logger.getLogger(LoggerTest.class.getName() + "." + i);
        }

        System.out.println(generateMemoryStatus("after"));

        Thread.sleep(10000L);

        System.out.println(generateMemoryStatus("after cool off"));
    }

    private String generateMemoryStatus(String label)
    {
        System.gc();

        Runtime runtime = Runtime.getRuntime();

        long total = runtime.totalMemory();
        long free = runtime.freeMemory();
        long used = total - free;

        return String.format("used memory: %,10d bytes  %s", used, label);
    }
}
也就是说,它消耗了超过20MB的内存(在eclipse中也尝试过)。 在实际应用程序中,父记录器和所有处理程序都将从记录器中删除,但由于这没有任何区别,因此我在这里省略了这一点

召唤

LogManager.getLogManager().reset();
没有帮助。因此,我将为我的应用程序创建一个记录器池,并重用记录器


我的问题是:有没有办法实际删除java.util.logging.Logger对象,即从内存中删除它们?

您不能强制JVM从内存中删除对象

调用
System.gc()
不能保证垃圾收集器运行。如果JVM认为它有足够的内存,那么调用<代码> St.gC.()可能会被忽略。p> 你能详细说明一下你的内存泄漏吗?我的意思是,在现代硬件和使用JVM的情况下,某些对象占用25Mb并不是我所说的内存泄漏

运行应用程序时是否存在具体的内存问题,如
OutOfMemoryError


您不一定需要将对象池化,JVM将在需要时从内存中删除它们。如果您只想看到它的运行,只需使用较小的堆运行(例如
-Xmx15m
)。但这不是一个好主意。你不应该考虑调整内存,除非你有问题,比如<代码> OutOfMeMyRebug < /C> > ./P>谢谢你的回答,我会用较小的堆来测试它。我将堆大小设置为20MB,并创建了两倍于记录器数量的日志,使用的内存始终保持在14MB以下。
LogManager.getLogManager().reset();