我有一个Java applet(一个实际的< APPLET>),它会为System.out生成频繁的日志消息。如果在用户的浏览器中启用了Java控制台,它当然会保留对所有这些字符串的引用,并防止它们被垃圾回收。问题是控制台保留的日志消息数量:applet堆增长非常快。运行四天后,它将抛出一个OutOfMemory异常。据我所知,从jmap和jhat可以看出,日志字符串代表了它的大部分内容。
是否有API可以更严格地限制Java控制台保留的消息的数量或总大小?如果出现错误,我只需要最近的几条消息。控制台确实会在某个时刻开始淘汰最旧的消息,但只有在它变得非常庞大之后才会消失。
我意识到“不启动控制台”或“只是清除控制台”是可能的解决方案,但您是否曾尝试向非技术用户询问他们是否启用了Java控制台?或者尝试通过查看和清除它们?我真的希望他们启用控制台,所以如果出现错误,我可以看到消息。
答案 0 :(得分:1)
而不是System.out.println
使用java.util.logging。以后更改日志级别并减少日志消息的数量要容易得多。
同时检查MemoryHandler,它使用缓冲区并自动丢弃旧的日志消息。