文章目录
JVM
JVM简略结构
JVM思维导图
类加载器
- 类加载实例
类加载过程
双亲委派机制
- 类加载步骤
沙箱安全机制
StackOverflowError
public class Test{
public static void main(String[]args){
new Test().a();
}
public void a(){
b();
}
public void b(){
a();
}
}
Native
PC寄存器
方法区
栈
堆
堆的结构
OOM(OutOfMemoryError:Java heap space
处理OOM:
1.尝试扩大堆内存看结果 (-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError)
2.分析内存,看一下那个地方出现了问题。
JDK1.8以后Heap
新生区
老年区
- 新生期杀不死的东西
永久代
public class Main{
public static void main(String[]args){
//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();//字节
//返回Jvm的初始化总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max = "+ max +"字节\t" + (max/(double)1024/1024) + "MB");
System.out.println("total = "+ total +"字节\t" + (total/(double)1024/1024) + "MB");
}
//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
//初始 和 最大
//默认情况下: 分配的总内存是电脑内存的1/4,而初始化的内存: 1/64.
}
-
运行结果
-
GC
- 轻GC(GC)
- 重GC(Full GC)
GC
引用计数法
复制算法 (主要用在新生区)
- 幸存from 幸存 to (谁空谁是to)
from -> to
- 好处: 没有内存的碎片
- 坏处:浪费了内存空间:多了一半空间永远是空 to。假设对象100%存活(极端情况)
复制算法最佳使用场景:对象存活度较低的时候:新生区.
标记压缩清除算法
- 优点:不需要额外的空间
- 缺点:两次扫描,严重浪费时间,会产生内存碎片。
标记压缩算法
总结
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
年轻代:
- 存活率低
- 复制算法
老年代:
- 区域大:存活率高
- 标记清除(内存碎片不是太多)+标记清除压缩混合实现
最优算法?
没有,没有最好的算法,只有最合适的算法--------->GC:分代收集算法。