0

ネストされた 2 つのループを含むプログラムを実行すると、このエラー OutOfMemoryError java heap space が発生します。1 週間解決策を探していましたが、結果はありません。ループのインスタンスの作成に問題がある可能性があることを知っていますそのため、メモリリークが発生するため、多くのメモリが必要です。メモリサイズを増やしてみましたが、これでは十分ではありません。私の質問は、実行時に多くのメモリを使用せずに同じプログラムを開発する方法です.これは私のプログラムです.

public String getAllActionsJson(){
        //liste des actions de la table action
        List<Action> actions = actionService.getAllActions();
        //liste onglets de la table typeAction
        List<TypeAction> typesActions=actionService.getTypeActions();
        ActionNoeudJson actionRacine = null;
        ActionNoeudJson actionFeuille = null;
        List<ActionNoeudJson> listeFilles = null;
        for(int i=0;i<typesActions.size();i++)
        {
            listeFilles = new ArrayList<ActionNoeudJson>();
            actionRacine=new ActionNoeudJson();
            actionRacine.setId(typesActions.get(i).getId());
            actionRacine.setText(typesActions.get(i).getLibelle());
            for(int j=0;j<actions.size();j++)
            {
                //si le type de l'action est le meme que le type de l'onglet
                //on affecte actionFeuille à la racine courante(onglet approprié) 
                if(typesActions.get(i).getId()==actions.get(j).getTypeAction().getId())
                {   
                    actionFeuille = new ActionNoeudJson();
                    actionFeuille.setId(actions.get(j).getId());
                    actionFeuille.setText(actions.get(j).getLibelle());
                    actionFeuille.setIconCls("icon-tip");
                    listeFilles.add(actionFeuille);
                    actionRacine.setChildren(listeFilles);
                }   
            }
            listeActions.add(actionRacine);

        }
        return ActionSupport.SUCCESS;

    }
4

1 に答える 1

0

これは、アルゴリズム分析と呼ばれる科目の研究領域です。少なくともBig O Notationに慣れていない場合 、アルゴリズムを改善する方法を理解するのは非常に困難です。

その表記法を理解し、基本的な分析を行うことができる場合は、コードのどの部分が最も多くのメモリを使用しているかを調べ、最初にそれを最適化してみてください。たとえば、その計算には実際には必要のないデータを持ち歩いている可能性があります。

すべてのタイプのすべてのアクションにいくつかの値を設定しようとしているようです。チャンクでそれを行うのはどうですか?すべてを同時にメモリに保持しないように、作業を分割してみてください。次に、アクションのフラットな配列を徐々に構築し、配列内のすべての要素に対して単一の for to listeActions.add() を実行します。

于 2013-02-10T16:53:18.250 に答える