2

このメソッドをデバッグしようとしていますが、何も機能していないようです...
条件文で pathName.add() が問題を引き起こしていると思われます。このメソッドが実行された後、もう一度実行すると 50 MB が使用され、800 MB に達するまでに 150 MB が使用されます。しかし、すべては割り当てられたスペースです。GC がこの混乱をきれいにしないのはなぜですか ???

Ps このメソッドは、条件付きステートメントで構築された指定されたパスに基づいてディレクトリを作成しました

Ps Ps メソッド writeDir(...) は actionListener 内から呼び出されます (GUI のボタンがクリックされたとき)。ボタンは頻繁にクリックできます

Ps Ps Ps Andreas の提案を試しましたが、部分的に機能しました。pathName.clean() を呼び出した後、eden スペースは削除されましたが、割り当てられたスペースはまだ増加しており、最大数に達しました。

メモリ スナップショット

あなたの意見に興味があります:)ありがとう

writeDir(...) を呼び出す

startButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
            try {
                        progress(0);
                        XMLSaxLogic stax = new XMLSaxLogic(xmlPath);

                        DetectionFilter detectionFilter = new DetectionFilter(stax.getObjets());
                        try {
                            WriteFile writeFile = new WriteFile(detectionFilter.getDetectionList());
                            writeFile.writeDir(savedDirPath, detectionFilter.getHardwareList(), stax.getSiteName());
                            progress(100);
                        } catch (Exception a) {
                            System.out.println(a.getLocalizedMessage());
                        }
                        GetFileCount getFileCount = new GetFileCount(savedDirPath, detectionFilter.getDetectionList(), combo.getSelectedIndex());

                        getFileCount.getFile(savedDirPath.getAbsoluteFile().toString());
                    } catch (Exception a) {
                        System.out.println(a.getLocalizedMessage());
                    }
}
}

書き込みディレクトリ(...)

   private ArrayList<String> detectList;
   private String detection = null;
   private String build = null;
   private Set<String> pathName = new LinkedHashSet<>();
   public WriteFile(ArrayList<String> detectList) {
       this.detectList = detectList;
   }
public void writeDir(File root, ArrayList<String> sevenElementList, ArrayList<String> oneElementList) {

    for (String site : oneElementList) {
        for (String s : sevenElementList) {
            int indexx = s.indexOf("_");
            int id = Character.getNumericValue(s.charAt(indexHardware - 1));

            for (String detectionList : detectList) {
                int index = detectionList.indexOf("_");
                int sId = Character.getNumericValue(detectionList.charAt(index + 1));

                if (detectionList.contains("Apple") && sId == id) {
                    detection = site.trim() + "/" + s + "/" + detectionList.trim();
                    pathName.add(format(detection));
                } else if (detectionList.contains("Banana") && sId == id) {
                    build = detection.trim() + "/" + detectionList.trim();
                    pathName.add(format(build.trim()));
                } else if (detectionList.contains("nananana") && sId == id) {
                    pathName.add(format(build.trim() + "/" + detectionList.trim()));
                } else if (detectionList.contains("Watermelone") && sId == id) {
                    pathName.add(format(build.trim() + "/" + detectionList));
                } else if (detectionList.contains("Orange") && sId == id) {
                    pathName.add(format(site.trim() + "/" + s.trim() + "/" + detectionList.trim()));
                }
            }
        }
    }
    createDirTest(pathName, root);
}
private void createDirTest(Set<String> pathArray, File root) {
    for (String s : pathArray) {
        File subdir = new File(root, s);
        subdir.mkdirs();
    }
}

private String format(String toBeFormated) {
    String toBeTrimmed = trimLastChar(toBeFormated.replace("ä", "ae").replace("ß", "ss").replace("ü", "ue").replace("ö", "oe").trim());
    return toBeTrimmed;
}
4

2 に答える 2

0

開始ボタンをクリックすると新しいオブジェクトが作成されたことに気付いた後、WriteFile writeFile = new WriteFile(...)私はあなたのオブジェクトの作成を別の場所に移動しました(そこに1つだけ作成されます!)。GetFileCount getFileCount = new GetFileCount(...)XMLSaxLogic stax = new XMLSaxLogic(...)

これでメモリの問題はなくなり、ボタンを連続してクリックしても 150MB を超えることはありません。すべてが正常に見えます。しかし、コードにはまだいくつかの参照の問題があると確信していますが、デバッグのおかげで主な問題はなくなりました:)

教訓: オブジェクトを頻繁に作成しすぎないようにしてください ^^

@Andreasと@ouflakに感謝します!!

于 2015-09-16T08:27:41.793 に答える