MinorGC的过程(复制->清空->互换) ①eden、SurvivorFrom 复制到 SurvivorTo,年龄+1 首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区,当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1
②清空 eden、SurvivorFrom 然后,清空Eden和SurvivorFrom中的对象,也即复制之后有交换,谁空谁是to
**③SurvivorTo和 SurvivorFrom 互换 ** 最后,SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区。部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代
真相:98%的对象是临时对象,不会进入到old区
对象进入老年代规则躲过15次GC之后进入老年代(-XX:MaxTenuringThreshold设置)
大对象直接进入老年代(-XX:PretenureSizeThreshold设置)
动态对象年龄判断(年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n以上的对象都放入老年代)
Gc对象太多无法放入Survivor区,会将这些对象放到老年代 (通过老年代空间分配担保规则)
常量池的区别
| **常量池/class常量池 **
**(Constant Pool) ** | java文件被编译成 class文件,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是常量池(Constant Pool),用于存放编译器生成的各种字面量( Literal )和 符号引用(Symbolic References)。
字符串常量池/全局字符串池
(String Pool)
运行时常量池
(Runtime Constant Pool)
符号、直接引用 符号引用 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
一般包含以下三类常量
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
直接引用 直接引用可以使直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是与虚拟机实现的内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在内存中存在。
字面量、常量、变量 int a; //变量 const int b = 10; //b为常量,10为字面量 string str = “hello world!”; // str 为变量,hello world!为字面量