2017-05-09 5 views
0

私は方法の変数であるすべてのA2、A1、メソッドに変数がフィールドに変更されたときに、スタックをヒープに変更するプロセスは何ですか?

public static RelationEntityWrapper findRelationByUserId(){ 
    //situation 1 
    List<ObjectA> list = new ArrayList(); 
    ObjectA a1= new ObjectA(); 
    ObjectA a2= new ObjectA(); 
    list.add(a1); 
    list.add(a2); 
    //situation 2 
    Relations.add(list); 
} 

public Relations(){ 
    public static LinkedBlockingQueue relationToDBQueue=new 
    LinkedBlockingQueue<ObjectA>(1024*1024); 
    static{ 
     new Thread(new Runnable() { 
       @Override 
       public void run() { 
        while (true) {    
         try { 
          ObjectA info = relationToDBQueue.take(); 
         }catch(Exception e){} 
       } 
    }}} 
     public static void add(List<ObjectA> list) { 
      try { 
       for(ObjectA o :list) 
       relationToDBQueue.add(o); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
} 

状況1

リストを持っているので、それらをスタック

状況2

に保存されています

メソッドの変数は、関係のフィールドに格納するように変更されます。relationToDBQueue、 list、a1、a2変数スタックメモリをヒープにコピーしますか?状況のプロセスは何ですか?

ありがとうございました。

答えて

1

Javaオブジェクトは決してスタックに格納されません。常にヒープ。しかし、しばしば、スタック上のオブジェクトへの参照があります。あなたの例では、これらの参照はスタックからヒープにコピーされます。

+0

Offtopic:あなたのコメントにはなぜArrayIndex ...質問には116 upvotesがあります。シンプル:A)よく書かれていて、コア問題を指摘しています。B)それは長い間外出していて、人々がうまくやってくれれば、新しいArrayIndexのものはすべてDUPになります。だから確かに、その質問は多くの注目を集めています。私はそれに何か悪いことは見ません。 – GhostCat

関連する問題