sun.print.Win32PrintServiceLookup.notifyPrinterChange中的内存泄漏

时间:2017-09-01 06:47:25

标签: java tomcat printing

当我在Windows中停止我的Tomcat服务器时有时候我需要等待很长时间,在这些情况下我收到了这个警告:

org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [Thread-6] but has failed to stop it. This is very likely to create a memory leak.
Stack trace of thread:
 sun.print.Win32PrintServiceLookup.notifyPrinterChange
 sun.print.Win32PrintServiceLookup.access$100(Unknown Source)
 sun.print.Win32PrintServiceLookup$PrinterChangeListener.run(Unknown Source)

我的网络应用中唯一与打印机连接的代码是可用打印机的读卡器:

PrintService[] printServices = PrinterJob.lookupPrintServices();

你知道如何避免这个问题吗?

1 个答案:

答案 0 :(得分:2)

该线程为started by Win32PrintServiceLookup itself,除非它认为您使用的是Windows 98 ,它使用系统属性os.name进行验证,因此这是一个时髦的(暂定的)解决方法:

String osName = System.getProperty("os.name");
if (osName.startsWith("Windows")) { // or SystemUtils.IS_OS_WINDOWS if you use commons-lang
    System.setProperty("os.name", "Windows 98");  // Pretend you're on Win98
}
PrinterJob.lookupPrintServices();
System.setProperty("os.name", osName); // Restore original value

我还没有测试过(今天没有Windows系统),所以我希望它仍然可以获得一次列表。这也意味着您在应用程序生命周期内无法注册打印机的更改。