jvm笔记

    技术2025-08-02  25

    JVM学习笔记

    应该明白的问题:

    对jvm的理解?java8虚拟机和之前的变化更新?

    什么是OOM,什么是栈溢出StackOverFlowError?具体分析?

    JVM的常用调优参数有哪些?

    内存快照如何抓取,怎么分析Dump文件?

    谈谈JVM中,类加载器你的认识?

    1. jvm的位置

    运行在操作系统之上

    2. jvm体系结构

    3. 类加载器

    作用:加载.class文件 ----》 1. 虚拟机自带的加载器 2. 启动类(根)加载器 3. 拓展类加载器(jdk1.8之后改为平台类加载器) 4. 应用程序加载器

    4. 双亲委派机制

    保证安全性能;APP–>EXC—>BOOT

    当一个类加载器加载一个类时,会委托其父类来进行加载;

    5. 沙箱安全机制

    沙箱安全机制是一个限制程序运行的环境。沙箱机制将Java代码限定在虚拟机特定的运行范围内,并严格限制代码堆本地资源的访问。

    6. Native

    native:凡是带native关键字的,会去调用底层C/C++语言的库

    //进入本地方法栈中,调用本地方法接口(java native interface)

    //JNI作用 :拓展Java的使用,融合不同的编程语言为Java多用。

    7. PC寄存器

    每一个线程都有一个程序计数器,线程私有,指向方法区中的字节码,在执行引擎读取下一条指令。

    8. 方法区

    方法区是被所有线程共享的

    存储已被加载的:静态变量,常量,类信息

    9. 栈

    栈内存:主管程序的运行,生命周期和线程同步;

    线程结束,栈内存释放,栈中,不存在垃圾回收问题;

    栈:基本类型+对象的引用+实例的方法

    10. 三种jvm

    11. 堆

    GC垃圾回收,主要是在伊甸园区和养老区 假设内存满了,OOM,堆内存不够, 在jdk8之后,永久存储区改名(元空间)

    12. 新生区、老年区

    13. 永久区

    这个区域常驻内存,存放JDK自身携带的Class对象,Interface元数据,存储Java运行时的一些环境 * jdk1.6之前:永久代,常量池在方法区 * jdk1.7 :永久代,常量池在堆中 * jdk1.8 :无永久代,常量池在元空间

    14. 堆内存调优

    项目中,出现OOM故障,怎么排除? 调整对内存大小 dump文件 分析 jprofile

    15. GC(垃圾回收)

    JVM在进行GC时,并不是对三个区域统一进行回收。大部分时候,回收的时新生代 * 新生代 * 幸存区(from to) * 老年区 GC种类:轻GC , 重GC **GC题目:** * JVM的内存模型和分区,详细每个区放什么? * 对里面的分区有哪些?Eden,from,to,老年区? * GC算法?标记清楚算法,标记压缩,复制算法,引用计数器 * 轻GC和重GC分别用在什么时候?

    复制算法

    坏处:浪费内存空间,一半的幸存区保持空 好处:没有内存碎片

    标记清除算法

    * 优点:节省空间 * 缺点:两次扫描,浪费时间,产生内存碎片

    标记压缩算法 16. 总结

    * 内存效率:复制算法 > 标记算法 >标记压缩 (时间复杂度) * 内存整齐度: 复制算法==标记压缩 > 标记清楚算法 * 内存利用率: 标记压缩算法= 标记清楚算法 > 腐殖酸算法 **年轻代** * 存活率低 * 复制算法 **老年代** * 区域大:存活率 * 标记清楚+标记压缩混合实现
    Processed: 0.019, SQL: 9