About the location of data structure and its inner objects

Tao Mao tao.mao at oracle.com
Mon Aug 26 18:23:08 UTC 2013


Java always conceptually holds a reference rather than the whole object 
body, but you can directly see and use the body in C++.

Below let me illustrate on the HashMap example?

Tao

On 8/26/13 1:20 AM, Lijie Xu wrote:
>
> Hi, folks. I’m confused with the concrete locations of the data 
> structure and its inner objects in the heap. The questions are below.
>
> A general question:
>
> 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.
>
>
> Two concrete questions.
>
> Q1: Can an array such as byte[], String[] and Object[] span two 
> generations?
>
> 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[].
>
> Q2: Can ArrayList, LinkedList, HashMap span two generations?
>
> For example, I initialize some data structures as follows.
>
Say, hashMap = {str1: obj1; str2: obj2; ...; strn: objn;}

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.

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.

Hope this helps build a concrete picture of memory layout.

> --------------------------------------------------------------------------------------------------
>
> *import*java.util.ArrayList;
>
> *import*java.util.HashMap;
>
> *import*java.util.LinkedList;
>
> *import*java.util.List;
>
> *import*java.util.Map;
>
> *public**class*ObjectTest {
>
> *public**static**void*main(String[] args) {
>
>        List<Obj> arrayList = *new*ArrayList<Obj>();
>
>        List<Obj> linkedList = *new*LinkedList<Obj>();
>
>        Map<String, Obj> hashMap = *new*HashMap<String, Obj>();
>
> *for*(*int*i = 0; i < 10000; i++) {
>
>            Obj arrayObj = *new*Obj();
>
>            arrayList.add(arrayObj);
>
>        }
>
> *for*(*int*i = 0; i < 10000; i++) {
>
>            Obj linkedObj = *new*Obj();
>
>            linkedList.add(linkedObj);
>
>        }
>
> *for*(*int*i = 0; i < 10000; i++) {
>
>            String str = i + "";
>
>            Obj hashObj = *new*Obj();
>
>            hashMap.put(str, hashObj);
>
>        }
>
>     }
>
> }
>
> *class*Obj {
>
> *byte*[] bytes;
>
> *public*Obj() {
>
> bytes= *new**byte*[16];
>
>     }
>
> }
>
> --------------------------------------------------------------------------------------------------
>
> 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.
>
> 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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20130826/a4d73cac/attachment.htm>


More information about the hotspot-gc-dev mailing list