java Javafx内存泄漏
我有一个电话簿申请。启动时,应用程序会将所有内容加载到trie和列表中,将它们放在应用程序右侧的列表视图中,左侧有一些文本字段和图像视图,因此当在列表中进行新选择时,这些信息字段会更新为新的联系人详细信息
就像这样:
因此,在加载和查看所有内容之后,没有任何内容被再次创建,我也没有保留任何引用
当选择新联系人时,我获取他的数据,并将其替换为字段中的以前数据,即使是图像,我只保留对imag位置的引用。当选择联系人时,我会加载一个新图像并将其放入图像视图:
public void createImage(String url, double loadWidth, double loadHeight, Point2D viewPortStart)
{
notifier.setVisible(false);
//load the image
try{
File file = new File(url);
if(!file.exists())
throw new Exception();
Image image = new Image(file.toURI().toURL().toString(),loadWidth,loadHeight,true,true);
//set dragging fields
this.viewPortStart.x = viewPortStart.getX();
this.viewPortStart.y = viewPortStart.getY();
moved.x = viewPortStart.getX();
moved.y = viewPortStart.getY();
//put image to view
view.setImage(image);
//update viewport
view.setViewport(new Rectangle2D(viewPortStart.getX(),viewPortStart.getY(),SIZE,SIZE));
//notify that this component contains a photo now
containsPhoto.setValue(true);
notifier.setVisible(false);
validProperty().setValue(true);
imageLocation = url;
imageHeight = loadHeight;
imageWidth = loadWidth;
}
catch (Exception ex)
{
createEmptyImage();
showImageLoadError(url == null ? "unknown path":url);
}
}
所以我开始用你的工具包分析这个。在应用程序启动时,它在工具包中使用50mb,在任务管理器中使用120mb。然后,我用键盘查看整个cantacts列表,然后强制执行垃圾收集,任务管理器上新使用的内存为400mb,yourkit上新使用的内存为120MB
请参见下面所选的蓝线,指示我强制抓取收集的时间。
它表示使用了120mb,但当我拍摄快照时,我只看到15MB的保留对象
有人能帮忙澄清这一点吗?或者我该如何追踪泄漏
# 1 楼答案
已分配内存是JVM必须使用的内存,而已使用内存是在任何给定时间实际使用的内存量。可以在JVM启动时为分配的内存指定最小值和最大值。最初,JVM将分配最小值,如果应用程序需要,则分配更多。如果随着时间的推移,使用的内存远远低于分配的内存,后者也会下降。Windows中的任务管理器通常只报告分配的内存
如果应用程序未被使用,通常会看到一种“锯齿”模式,即使用的内存会增长到下一次垃圾回收,然后下降到上一次gc之后的水平。这是正常现象,并不意味着内存泄漏
但是,如果每次gc后使用的内存量随时间增加,则表明内存泄漏