java的垃圾回收机制
static String str0= "0123456789" ; static String str1= "0123456789" ; String str2=str1.substring( 5 ); String str3= new String(str2); String str4= new String(str3.toCharArray()); str0= null ; |
假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()
-
5
-
10
-
15
-
20
这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。
堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池,静态代码块,构造函数,接口初始化等。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,如下图:
经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen。所以答案选C
方法区:主要存储结构信息的地方,比如方法体,同时也是存储静态变量,
以及静态代码块的区域,构造函数,常量池,接口初始化等等
方法区物理上还是在堆中,是在堆的持久代里面。堆有年轻代
(由一个Eden区和俩个survivor区组成),老年代,持久代。新创建的对象都在年轻代的Eden区,经过一次JC收集后,存活下来的会被复制到
survivor区(一个满了,就全部移动到另外一个大的中,但要保证其中一个survivor为空),经过多次JC后,还存活的对象就被移到老年代了。
持久代就是经常说的方法区里面存放类信息,常量池,方法等 static String str0="0123456789";
static String
str1="0123456789";是放在方法区里。也就是持久代,题目中已经说了,不包含持久代,所以剩余空间为5+5+5=15.
相关文章
- java/jsp: 登录系统
- Java实现 LeetCode 436 寻找右区间
- Java实现 LeetCode 173 二叉搜索树迭代器
- Java实现 LeetCode 98 验证二叉搜索树
- 深入理解java垃圾回收机制
- 深入理解java垃圾回收机制
- 深入理解java垃圾回收机制
- Java实现 蓝桥杯 历届试题 大臣的旅费
- java的特点
- 深入浅出: Java回调机制(异步)
- java小结
- java学习之maven
- JVM 第三篇:Java 类加载机制
- 深入浅出Java垃圾回收机制
- Atitit zip解压文件 java use apache ant.jar C:0wkspchislogsrcmainjavacomattilaxcompressZipUt
- JavaSE进阶 | 一文带你吃透Java中的异常处理机制
- java中接口(interface)
- JAVA弹球小游戏
- 解决java.lang.IllegalArgumentException: Could not resolve placeholder ‘xxx‘ in value “${xxx}“问题
- Java反射机制获取Class文件
- JAVA gc垃圾回收机制
- JAVA基础 (二)反射 深入解析反射机制
- JAVA反射机制
- Java Instrumentation 内存马——主要是利用Instrumentation Java API来做内存注入,会用到反射机制,文中提到检测思路:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测
- Java反射机制的作用?
- Java中的反射机制详解
- Java中的等待/通知机制