我现在正在为一个令人讨厌的问题而苦苦挣扎。 在我的Java Swing应用程序中,我使用两个JTextPanes扩展了XML-Text的语法高亮显示,如下例所示,只做了一些小改动: 在JTextPanes中突出显示XML语法
这两个JTextPanes放置在两个JScollPanes中的JSplitPane中,该JSplitPane直接放置在JFrame的ContentPane中。 第一个TextPane是可编辑的(就像一个简单的XML请求编辑器),第二个TextPane显示来自我的服务器后端的XML响应。
一切都按预期工作,只要我不尝试在这些XmlTextPanes中放置“多行”。 这会导致内存使用量的快速增长(在将几行插入到一个或两个TextPanes之后,从<100 mb到1.000 mb)。 奇怪的是,即使重置Textpanes和/或删除它们(或者丢弃持有组件的Frame)也不会改变所使用的内存! 强制垃圾收集也不会改变任何东西。 东西还必须持有引用分配的东西….
为了看看究竟是什么消耗了所有的内存,我尝试使用Eclipse MATS分析应用程序,结果如下:
清楚地表明,CachedPainter是持有很多东西…问谷歌似乎我不是唯一一个与CachePainter内存问题,但我无法find一个原因 – 甚至更重要的 – 和解决scheme。
经过这么多个小时的设置后,我发现当我设置我的应用程序使用时,这个问题不会发生
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
代替
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
通过crossPlatformLookAndFeel,我能够在我的文本框中放入数千行xml内容,而无需使用超过200 MB的内存。 使用相同的代码,但设置为PlatformLookAndFeel(Windows 7),我达到超过2k MB的内存使用约200行后
我可以重现这种行为编译对JDK7和JDK8 :(。
是什么原因造成的,我该如何解决?
€dit:一些额外的信息:关于进一步的研究,似乎有些LAF有d3d缓冲区的问题。 这在MATS屏幕截图中的int []可能是某种渲染缓冲区,也指向相同的可能方向….我的应用程序已经设置,以防止一些渲染性能问题(例如框架resize):
System.setProperty("sun.java2d.noddraw", Boolean.TRUE.toString());
我可以尝试将这个标志添加到startparameters:
-Dsun.java2d.d3d=false
或者你认为这不会有帮助?
别担心 这不是内存泄漏。
ImageCache基于SoftReferences。 来源
public class ImageCache { private int maxCount; private final LinkedList<SoftReference<ImageCache.Entry>> entries; ....
从Javadoc
在虚拟机抛出一个OutOfMemoryError之前,保证所有对软性可达对象的软引用都被清除。
所以当你没有足够的内存时,缓存被清除以释放足够的内存。