如果没有 survivor,那么Eden 每次 GC 后存活的对象就会进入老年代,老年代就会很快满了,触发 FULL GC 消耗的时间要长很多,所以要分为 Eden 和 Survivor ,只有经历 15 次以后,依旧存活的对象才会进入老年代,同时避免了碎片化的发生,(保证 s0 和 eden 两部分的存活对象占用连续的内存空间,从而避免碎片化)
元空间和永久代的区别:在 java8 中,永久代已经被移除,被元空间给取代,元空间的本质和永久代类似,元空间与永久代之间最大的区别在于,元空间并不在虚拟机中,而是使用本地内存,所以默认的元空间受本地内存的限制
说一下 CMS 和 G1 收集器:CMS 是多线程标记清除算法
主要目标是获取最短垃圾回收停顿时间,分为四个阶段:初始标记、并发标记、重新标记、并发清除
G1 收集器最突出的改进是:
1、基于标记-整理算法,不产生内存碎片
2、可以精准地控制停顿时间,确保能在有限的时间内,获得最高的垃圾收集效率
JVM 性能调优:-Xms:堆内存大小限制
-XX:NewSize 新生代大小
-XX:NewRatio 新生代和老年代占比
JVM 的位置运行在操作系统之上
. java 文件通过 javac 命令编译成 .class 文件,然后通过 类加载器 加载到 JVM 中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3ybCz4P-1641975332811)(C:Users62459AppDataRoamingTyporatypora-user-imagesimage-20220111155321776.png)]
本地方法栈,java 栈,程序计数器中没有垃圾回收机制,JVM 调优,多数情况就是在调 堆
类加载器:虚拟机自带的加载器
根加载器
拓展加载器
应用程序加载器
作用:加载 class 文件
沙箱安全机制: 字节码校验器:确保 java 类文件遵循 java 语言规范,可以帮助 java 程序实现内存保护。
类装载器:防止恶意代码干涉善意代码(双亲委派机制)
守护了被信任的类库边界
将代码归入保护域,确定了代码可以进行哪些操作
双亲委派机制:1、类加载器收到类加载的请求
2、将这个请求委托给父类加载器去完成,一直向上委托,直到启动类加载起
3、启动加载器检查是否能加载当前类,能加载使用,否则抛出异常,通知子加载器进行加载
4、重复
都加载不了,就报异常:classNotFoundExcepion
在运行前,需要向上找,最终执行根加载器的 jar 包
app -> ext -> boot 深搜到 boot 然后寻找 jar 包, 如果找到直接使用,如果找不到就去 ext,同理 app
native 关键字new Thread start 执行以后,执行 native 修饰的 start0 方法
凡是 native 修饰的方法,说明 java 的作用达不到了,会进入本地方法栈,通过本地方法接口,调用本地的 C 语言库
PC 寄存器:程序计数器,每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码,占用非常小的内存空间
方法区:方法区是被所有线程共享的,是共享区间
静态变量,常量,类信息(构造方法,接口定义)、运行时的常量池存放在方法区中
static final Class 运行时常量池
但是 实例变量 存放在堆内存中,与方法区无关
栈:栈:主管程序的运行,生命周期和线程同步,栈中没有垃圾回收,一旦栈空了,程序就执行完毕了。
栈中存储:八大基本类型 + 对象引用 + 实例的方法
堆:一个 JVM 只有一个堆内存,堆内存的大小是可以调整的
堆内存的三个区域:
新生代所有的对象都是从伊甸园区 new 出来的
有百分之九十九的对象都是临时对象
老年代 元空间(常驻内存,存放 jdk 自身携带的 class 对象)不存在垃圾回收,关闭 VM 虚拟机就会释放这个区域的内存
存放常量池
GC 垃圾回收主要在新生代和老年代
堆内存移除:OOM,OutOfMemoryError 无限增加字符串长度
在 jdk8 以后,永久代被元空间代替
出现 OOM 的解决方法:首先判断是否是代码自身有问题,是否存在字符串无限扩大等情况,如果没有,手动修改堆内存空间
Xms 设置初始化内存分配大小,默认 1 / 64
Xmx 设置最大分配内存,默认 1/4
-XX:+ PrintGCDetails 打印 GC 垃圾回收信息
Jprofiler 作用:分析 dump 内存文件,快速定位内存泄漏
获得堆中的数据
获得大的对象
GC:作用区域只存在堆和方法区
分为两种:轻 GC,重 GC
当某个对象经历了十五次 GC 还存活时,会进入老年区(默认十五次)
伊甸园区,幸存者区存活率低,主要是用 复制算法
老年代,区域大,因此使用 标记清除 + 标记压缩混合实现
JMM:(Java Memory Model) -> 并发问题是一种缓存一致性协议,用于定义数据读写的规则



