假定str0,…,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()

A.   5
B.   10
C.   15
D.   20

4 6 收藏


直接登录
最新评论
  • sdkl   2016/06/19

    B吧,我猜的

  • 王涛   2016/06/19

    a,猜的

  • lfsk 学生 2016/06/23

    d,(0123456789,01234,0,1,2,3,4)是这样吗

  • Sun_1956 90后程序猿 2016/06/23

    C.3个012345,其中一个是char array

    • Sun_1956 90后程序猿 2016/06/23

      是01234,不是012345 =_=

      • 王先生 学生 2016/06/24

        垃圾回收主要是针对堆区的回收,因为栈区的内存是随着线程而释放的,堆区分为三个代:年轻代,年老代,和永久代
        也就是方法区,
        年轻代:对象被创建时的对象通常被存放在Young(除了一些内存数据比较大的对象),经过一定的Minor GC
        (针对年轻代的内存回收),还活着的对象会被移动到年老代(一些具体的移动细节省略)
        年老代: 就是上述年轻代移动过来的一些比较大的对象,Minor GC(FULL GC)是针对年老代的回收
        永久代: 存储的是final常量,static常量,常量池
        str3和str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,
        经过fullGC之后,年老代的内存回收,则年轻区的占了15个,不算permGen,所以答案选C 15个

        • Sun_1956 90后程序猿 2016/06/24

          觉得你表述有点歧义!以下是我的一些观点:

          minor GC 是针对年老代的回收?写错了把!!

          还有题目中并没有出现说设置了minor GC很多次,有对象上升至年老代,所以年老代应该是没有题目中的那些对象的!

          而str0,str1是常量,在jdk7中应该是归属于永久代的常量池中的,而string类型又是不可变的,所以str0 == str1,剩余的都是new出来的又不同于string直接赋值,内部是一个char数组,所以str2,str3,str4的内容虽然相同,但却不是引用的一个01234,而是每个都有自己独立的01234。然后str0=null之后,常量池中str0,str1和0123456789之间的引用断掉了,所以经过full gc之后,应该是gc了常量池(即永久代)中的0123456789,而此时年轻代中的str2,str3,str4都是强引用,也没有超出生命周期,所以不会被回收,即3*5 = 15

  • jamF CTO 2016/06/27

    java中substring(5),是指从第五个字符开始到结尾的子串,56789 字符串,而不是01234字符串。楼上都统一弄错了。

  • aaa   2016/07/21

    确实是56789

  • 不懒   2016/09/27

    答案应该是10,str2 5, str4 5,str3复用了str2的char[]。

    str3: JDK7 早就改了,相同的String有相同的char[]结构,所以也没必要在构造方法再复制一遍。

    str4: 但是此例构造方法是char[],String没法判断此不变性,所以才必须复制一遍。