<div dir="ltr">Hi Lijie,<div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 28, 2013 at 10:46 AM, Lijie Xu <span dir="ltr"><<a href="mailto:csxulijie@gmail.com" target="_blank">csxulijie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Thank Tao, I think I have a graph of memory layout now. I have another five questions:<div>
<div><br></div><div>1) Can old space's max size be adjusted dynamically by GC while the JVM is running?</div><div>
<br></div></div></div></blockquote><div>Yes if you're using UseParallelGC / UseParallelOldGC and UseAdaptiveSizePolicy is on (it is on by default). Other GCs in HotSpot don't implement adaptive size policy yet.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div></div><div>2) I want to know if FullGC will definitely trigger MinorGC, or just reclaim the unreferenced objects in Old/Eden/S0/S1 without object promotion.</div>
<div><br></div></div></div></blockquote><div>A "full GC" in HotSpot terms collects the whole GC heap, not just the old generation. It doesn't have to do a separate minor GC before a full GC to collect the young generation.</div>
<div>A case for UseParallelGC / UseParallelOldGC is that it defaults to scavenge (do a minor GC) right before a full GC. This behavior can be turned off with -XX:-ScavengeBeforeFullGC</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div><div></div><div>3) Whether MinorGC can copy an object directly into Old if the Survior hasn't enough space to hold it currently?</div></div></div></blockquote><div><br></div><div>Yes, it could. That would be called a "premature promotion" / "survivor space overflow".</div>
<div>It is even possible to directly allocate a new object in the old generation. Assuming you can read Chinese, refer to this thread for an example: <a href="http://hllvm.group.iteye.com/group/topic/38293">http://hllvm.group.iteye.com/group/topic/38293</a> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div>
<div><br></div><div>4) Can JVM heap use virtual memory or just physical memory?</div><div><br></div></div></div></blockquote><div>In HotSpot VM's case, the virtual address space for the whole GC heap is allocated up front, during VM intialization, but is then only commited on demand. The virtual memory allocated won't be backed by physical memory before it's commited.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div></div><div>5) Can DirectBuffer use virtual memory or just physical memory?</div>
</div><div><br></div></div></blockquote><div>A NIO Direct-X-Buffer, if allocated from the Java side, is just a regular Java object in the Java heap, acting as a proxy to a backing buffer allocated via malloc() on the C heap. Whatever knowledge you have on malloc() applies here.</div>
<div>On the other hand, a Direct-X-Buffer can be created via JNI, too, wrapping an existing buffer in native code. [1] You can wrap any piece of native memory into a DirectByteBuffer this way.</div><div><br></div><div>HTH,</div>
<div>Kris</div><div> </div><div>[1]: <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBuffer">http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBuffer</a></div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div></div><div><br></div><div>
<br></div>
</div><div class=""><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 27, 2013 at 2:23 AM, Tao Mao <span dir="ltr"><<a href="mailto:tao.mao@oracle.com" target="_blank">tao.mao@oracle.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Java always conceptually holds a reference rather than the whole
    object body, but you can directly see and use the body in C++.<br>
    <br>
    Below let me illustrate on the HashMap example?<br>
    <br>
    Tao<div><br>
    <br>
    On 8/26/13 1:20 AM, Lijie Xu wrote:
    <blockquote type="cite">
      <div dir="ltr">
        <p>Hi, folks. I’m confused with the concrete
          locations of the data structure and its inner objects in the
          heap. The questions
          are below.</p>
        <p><span lang="EN-US">A general question: </span></p>
        <p><span lang="EN-US">If an object X is decided to be
            copied into
            old from new gen by GC, all the objects which can be reached
            from X are copied into old too.
            Or X’s retained set. Or this statement is wrong.</span></p>
        <p><span lang="EN-US"><br>
          </span></p>
        <p><span lang="EN-US">Two concrete questions.</span></p>
        <p><span lang="EN-US">Q1: Can an array such as byte[],
            String[]
            and Object[] span two generations?</span></p>
        <p><span lang="EN-US">I think primitive arrays such as
            byte[] and
            int[] cannot span (e.g., a part of the array exists in eden
            and the other part exists
            in old space). For reference arrays such as Object[], the
            array itself cannot
            span but the items in the arrays can span (i.e., some items
            exist in new gen
            while others exist in old gen). I’m not sure if I’m right
            and if String[] is as
            same as byte[].</span></p>
        <p><span lang="EN-US"> </span></p>
        <p><span lang="EN-US">Q2: Can ArrayList, LinkedList,
            HashMap span
            two generations?</span></p>
        <p><span lang="EN-US">For example, I initialize some
            data structures
            as follows. </span></p>
      </div>
    </blockquote></div>
    Say, hashMap = {str1: obj1; str2: obj2; ...; strn: objn;}<br>
    <br>
    The object body of hashMap is in the same generation, including the
    data structure containing references of str(i) and obj(i); however,
    the object bodies of str(i) and obj(i) may span different
    generations.<br>
    <br>
    BTW, hashMap itself (not its referenced object body) is a reference
    and, hence, on stack (not on java heap) since it's a local variable.<br>
    <br>
    Hope this helps build a concrete picture of memory layout.<div><div><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <p><span lang="EN-US">--------------------------------------------------------------------------------------------------</span></p>
        <p align="left"><b><span lang="EN-US">import</span></b><span style="font-family:'Courier New'" lang="EN-US">
            java.util.ArrayList;</span><span lang="EN-US"></span></p>
        <p align="left"><b><span lang="EN-US">import</span></b><span style="font-family:'Courier New'" lang="EN-US">
            java.util.HashMap;</span><span lang="EN-US"></span></p>
        <p align="left"><b><span lang="EN-US">import</span></b><span style="font-family:'Courier New'" lang="EN-US">
            java.util.LinkedList;</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><b><span lang="EN-US">import</span></b><span style="font-family:'Courier New'" lang="EN-US">
            java.util.List;</span><span lang="EN-US"></span></p>
        <p align="left"><b><span lang="EN-US">import</span></b><span style="font-family:'Courier New'" lang="EN-US">
            java.util.Map;</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span style="font-family:'Courier New'" lang="EN-US"> </span></p>
        <p align="left"><b><span lang="EN-US">public</span></b><span style="font-family:'Courier New'" lang="EN-US">
          </span><b><span lang="EN-US">class</span></b><span style="font-family:'Courier New'" lang="EN-US">
            ObjectTest {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">    </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">public</span></b><span style="font-family:'Courier New'" lang="EN-US">
          </span><b><span lang="EN-US">static</span></b><span style="font-family:'Courier New'" lang="EN-US">
          </span><b><span lang="EN-US">void</span></b><span style="font-family:'Courier New'" lang="EN-US">
            main(String[] args) {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       List<Obj>
            arrayList = </span><b><span lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            ArrayList<Obj>();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       List<Obj>
            linkedList = </span><b><span lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            LinkedList<Obj>();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       Map<String, Obj>
            hashMap = </span><b><span lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            HashMap<String, Obj>();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">            </span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">for</span></b><span style="font-family:'Courier New'" lang="EN-US">(</span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">int</span></b><span style="font-family:'Courier New'" lang="EN-US">
            i = 0; i < 10000; i++) {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">           Obj arrayObj = </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            Obj();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">          
            arrayList.add(arrayObj);</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left">
          <span style="font-family:'Courier New'" lang="EN-US">       }</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">              </span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">for</span></b><span style="font-family:'Courier New'" lang="EN-US">(</span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">int</span></b><span style="font-family:'Courier New'" lang="EN-US">
            i = 0; i < 10000; i++) {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">           Obj linkedObj = </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            Obj();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">          
            linkedList.add(linkedObj);</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left">
          <span style="font-family:'Courier New'" lang="EN-US">       }</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">              </span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">for</span></b><span style="font-family:'Courier New'" lang="EN-US">(</span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">int</span></b><span style="font-family:'Courier New'" lang="EN-US">
            i = 0; i < 10000; i++) {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">           String str = i + </span><span style="font-family:'Courier New';color:rgb(42,0,255)" lang="EN-US">""</span><span lang="EN-US">;</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>


        <p align="left"><span lang="EN-US">           Obj hashObj = </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
            Obj();</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">           hashMap.put(str,
            hashObj);</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left">
          <span style="font-family:'Courier New'" lang="EN-US">       }</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">    }</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">}</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span style="font-family:'Courier New'" lang="EN-US"> </span></p>
        <p align="left"><b><span lang="EN-US">class</span></b><span style="font-family:'Courier New'" lang="EN-US">
            Obj {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">    </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">byte</span></b><span style="font-family:'Courier New'" lang="EN-US">[]
          </span><span lang="EN-US">bytes</span><span style="font-family:'Courier New'" lang="EN-US">;</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">    </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">public</span></b><span style="font-family:'Courier New'" lang="EN-US">
            Obj() {</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">       </span><span style="font-family:'Courier New';color:rgb(0,0,192)" lang="EN-US">bytes</span><span lang="EN-US"> = </span><b><span style="font-family:'Courier New';color:rgb(127,0,85)" lang="EN-US">new</span></b><span style="font-family:'Courier New'" lang="EN-US">
          </span><b><span lang="EN-US">byte</span></b><span style="font-family:'Courier New'" lang="EN-US">[16];</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US">    }</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p><span lang="EN-US">
          </span></p>
        <p align="left"><span lang="EN-US">}</span><span style="font-family:'Courier New'" lang="EN-US"></span></p>
        <p align="left"><span lang="EN-US"><span style="color:rgb(34,34,34);font-family:arial">--------------------------------------------------------------------------------------------------</span><br>
          </span></p>
        <p><span lang="EN-US"></span><span lang="EN-US"></span></p>
        <p><span lang="EN-US">If new gen cannot hold all the
            objects, GC
            will occur. I want to know if all the items in the data
            structure are copied
            into old gen. </span></p>
        <p><span lang="EN-US">For example, arrayList itself
            exists in old
            while some of its arrayObjs exist in new gen. A arrayObj
            exists in old gen
            while its bytes exists in new gen.</span></p>
        <p><span lang="EN-US"> </span></p>
      </div>
    </blockquote>
  </div></div></div>

</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>