1. JVM内存
JVM内存:
1,虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等
栈的大小可以固定也可以动态扩展。
当栈调用深度大于JVM允许的范围,会抛出StackOverflowError
2,本地方法栈
3,PC寄存器:记录当前程序执行到哪一步
4,堆:存放所有的对象和数组。
分为新生代(伊甸园、存活区)占1/3堆空间、老年代占2/3堆空间
5,方法区:所有线程共享。用于存储类的信息、常量池、方法数据、方法代码等。
方法区逻辑上属于堆的一部分,但是为了与堆区分,又叫“非堆”
JDK1.8之前方法区的实现是永久代,JDK1.8之后分方法区的实现是元空间(元空间本地存储)
2. 永久代、元空间?
元空间和永久代概念?
元空间和永久代类似,都是JVM规范中方法区的实现
永久代是JVM虚拟机中一块内存空间,可以设置大小,在内存不够时会触发FullGC,也就是和老年代同时垃圾回收
元空间不属于JVM内存,而是使用本地内存,默认是可以无限制使用本地内存,也可以通过参数限制内存使用大小
元空间为什么代替了永久代?
1,字符串存在永久代中,容易出现性能问题和内存溢出。
2,类及方法的信息比较难确定其大小,永久代大小指定比较困难,太小容易出现永久代溢出,太大容易造成老年代溢出
3,永久代会为GC带来不必要的复杂度,并且回收效率偏低。
string声明的字面量数据都放在字符串常量池中
jdk1.6中字符串常量池存放在方法区(永久代中)
jdk1.7及以后字符串常量池存放在堆空间
如果不是用双引号声明的String对象,可以使用String提供的intern方法。
intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中
String string = new String("hello");
//将字符串放在常量池中
String intern = string.intern();
//直接从常量池获取
String str = "hello";
boolean flag = intern==str;
System.out.println("result = "+ flag);
3. 堆栈?
栈:方法调用(自动释放)、变量名
堆:new出的对象
4. GC
垃圾回收算法:mark-sweep标记清除、copying拷贝、mark-compact标记压缩
5. 分代模型:
新生代:coping算法,比例为8:1:1,eden(伊甸区8):survivor1:survivor1
新生代采用coping算法,
比如先给eden区new10个对象,然后回收9个对象,将剩余的1个放到survivor,这时eden区又为空
然后在eden区new10个对象,再回收时,回收eden区和第一个survivor区,将不需要回收的对象放在第二个survivor区
老年代:新生代survivor区装满之后,放到老年代
老年代满了之后会进行FGC(full)
6. serial+serial old垃圾回收组合
内存几十兆时:
serial单线程stw(stop the world)垃圾回收
serial采用copying拷贝算法,
serial old采用mark-sweep标记清除、mark-compact标记压缩
7. parallel scavenge+parallel old垃圾回收组合
parallel并行(其实就是多线程同时垃圾回收)
内存几百兆~1G时:
并行多线程
PS+PO组合
在需要垃圾回收时,多个线程同时干活
8. CMS+ParNew垃圾回收组合
CMS:concurrent-mark-sweep并发标记清除
几十G
Concurrent GC 并发垃圾回收
并发:指GC线程和业务线程同时进行
CMS适用于老年代
9. 三色标记算法
黑色标记对象A:对象和子对象都已完成标记
灰色标记对象B:对象已完成标记,但是子对象没有完成
白色标记对象D:对象和子对象都没有完成标记
当A的子对象是B,B的子对象是D时,如果BD之间断开关联,AD之间增加关联时。
需要将黑色标记对象A,改成灰色。这称为CMS解决方案incremental update增量更新
但是CMS存在bug,
当垃圾回收线程1标记完对象A和其子对象时,
切换到垃圾回收线程2,这时业务线程给对象A增加一个子对象,
垃圾回收线程2应该把对象A应该把A改成灰色的,
如果切换回垃圾回收线程1就还是会把A标记成黑色。
需要在重新标记时STW,浪费时间
10. G1
G1:garbage first首先回收垃圾特别多的区域
是一个老年代和新生代共用的垃圾回收器
G1采用局部收集的回收思想。将Java堆内存划分成多个相同大小的独立region区域。