JVM体系结构概览
亮色:所有线程共用;存在GC
暗色: 线程私有; 不存在GC
类加载器
- 什么是
- 有几种
- 双亲委派
- 沙箱安全
java memory management
结合下面这篇帖子
Java程序在内存中运行详解
stack管运行,heap管存储
Exception in thread "main" java.lang.StackOverflowError
这是一个Error不是Exception
java8之后,永久区换成了元空间。
物理上, heap只有新生区和养老区两个部分。
Eden区满了, 开启GC是YGC,Minor GC, Eden基本清空
S0 = from
S1 = to
S0, S1交换
from区和to区,他们的名分不是固定的,每次GC后会交换,GC之后有交换,谁空谁是to区
Old养老去满了,开启Full GC = FGC, Major GC
Full GC多次,发现养老区空间没法腾出来, OOM异常(堆内存溢出) OutOfMemoryError
public static void main(String[] args) {
long maxMemory = Runtime.getRuntime().maxMemory(); //返回Java虚拟机试图使用的最大内存量
long totalMemory = Runtime.getRuntime().totalMemory(); //返回Java虚拟机中的内存总量。
System.out.println("MAX_MEMORY=" + maxMemory + "(字节)、" + (maxMemory / (double)1024 / 1024) + "MB");
System.out.println("TOTAL_MEMORY=" + totalMemory + "(字节)、" + (totalMemory / (double)1024 / 1024) + "MB");
}
实际生产中必须把-Xms初始内存和-Xmx最大内存设置为一样的
在IDEA中配置JVM的堆内存
//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
引用计数算法
复制算法
复制算法,优点,没有碎片,缺点,耗空间
标记清除法
和标记压缩一样,一般用在老年代
标记压缩算法
整理由标记清除产生的碎片
标记-清除-整理算法,简称标记压缩
时间慢
第五种
分代收集!!!
所有算法的一个比较