JVM:
- jvm 的位置:运行在操作系统之上
2. jvm 的体系结构:****类加载器,执行引擎方法区,堆方法栈,本地方法栈,程序计数器本地方法接口 本地方法库!2.1 类加载器:只负责加载class 文件,执行引擎负责执行! 在jvm 中生成一个类的模板!分类:了解虚拟机自带的加载器启动类加载器(Bootstrap)C++扩展类加载器(Extension)Java应用程序类加载器(AppClassLoader)Java也叫系统类加载器,加载当前应用的classpath的所有类用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式加载顺序:有下往上2.2 执行引擎:Execution Engine执行引擎负责解释命令,提交操作系统执行。2.3 Native Interface本地接口、方法由natvie 修饰的! 由执行引擎加载本地方法库! 由c,c++ 编写的!2.4 程序计数器、PC寄存器:本质:指针 {向下一条指令的地址}2.5 方法区:{共享区间} {非堆}内有的东西:字段和方法字节码,以及一些特殊方法如构造函数,接口代码!静态变量+常量+类信息(构造方法/接口定义)+运行时常量池存在方法区中Cart cart = new Cart(); 在堆内存中!2.6 栈:栈内存:主管Java程序的运行!生命周期:跟线程一样!栈内存中存储的内容:8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。int a = 9;Cart cart = new Cart();栈运行原理:栈中的数据以栈帧{数据,文件}的形式存在! “先进后出”/“后进先出”原则.StackOverflowError:检查代码的业务逻辑!3. JVM 三大厂商了解;4. 堆:OutOfMemoryError:指的是堆内存溢出!可以通过参数-Xms、-Xmx来调整!幸存0区,幸存1区: 称之为:from ,to 区!需要经过15次GC 才会到养老区。 to 区 总是空的!1.7 堆的划分:新生区:养老区:永久区:1.8 堆的划分:新生区:养老区:元空间:永久区:虚拟机自身的class ,interface!1.8 我们将常量池移动到元空间上!
总结上午:
- jvm 体系架构图:
类加载器 : 执行引擎
方法区{共享区,非堆}:堆
方法栈:本地方法栈:程序计数器、PC寄存器:
本地接口,本地方法库!
了解:jvm 的体系架构图中每块的作用:2. 堆:新生区:伊甸区:新创建的对象 Student stu = new Student();幸存0区 from:幸存1区 to:to 区总是空!普通GC: 经过15次 幸存者来到养老区!养老区:Full GC:元空间:3. 如何调优!-Xms1024m -Xmx1024m -XX:+PrintGCDetailsidea 中如何设置获取到内存溢出数据:-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\HeapDumpOnOutOfMemoryError:导出oom 信息到文件!使用:jvisualvm.exe 解读文档!4. GC 讲解:GC: 分代收集算法最频繁:新生区次之: 养老区基本不动: 元空间,永久区!GC 4大算法:a. 引用计数法:不好维护:很难用b. 复制算法:新生区:优点:效率高,没有内存碎片产生缺点:需要双倍内存空间c. 标记清除:养老区:优点:节省内存空间缺点:两次扫描,可能会产生内存碎片!d. 标记压缩:养老区:优点:没有产生内存碎片:缺点:移动需要时间总结:新生区:复制算法养老区:标记清除-标记压缩普通GC 发生在新生区:Full GC 放生在养老区:
