有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Javafx内存泄漏

我有一个电话簿申请。启动时,应用程序会将所有内容加载到trie和列表中,将它们放在应用程序右侧的列表视图中,左侧有一些文本字段和图像视图,因此当在列表中进行新选择时,这些信息字段会更新为新的联系人详细信息

就像这样: enter image description here

因此,在加载和查看所有内容之后,没有任何内容被再次创建,我也没有保留任何引用

当选择新联系人时,我获取他的数据,并将其替换为字段中的以前数据,即使是图像,我只保留对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

请参见下面所选的蓝线,指示我强制抓取收集的时间。 enter image description here

它表示使用了120mb,但当我拍摄快照时,我只看到15MB的保留对象

enter image description here

有人能帮忙澄清这一点吗?或者我该如何追踪泄漏


共 (1) 个答案

  1. # 1 楼答案

    已分配内存是JVM必须使用的内存,而已使用内存是在任何给定时间实际使用的内存量。可以在JVM启动时为分配的内存指定最小值和最大值。最初,JVM将分配最小值,如果应用程序需要,则分配更多。如果随着时间的推移,使用的内存远远低于分配的内存,后者也会下降。Windows中的任务管理器通常只报告分配的内存

    如果应用程序未被使用,通常会看到一种“锯齿”模式,即使用的内存会增长到下一次垃圾回收,然后下降到上一次gc之后的水平。这是正常现象,并不意味着内存泄漏

    但是,如果每次gc后使用的内存量随时间增加,则表明内存泄漏