做网站开发多少钱,广州公共资源交易中心官网,长沙企业查询,企业的网站建设公司文章目录 #x1f412;个人主页#x1f3c5;JavaEE系列专栏#x1f4d6;前言#xff1a;#x1f380;你为什么要学习JVM#xff1f;#x1f380;JVM的作用 #x1f380;JVM的构成#xff08;5大类#xff09;#x1f3e8;1.类加载系统#x1f415;类什么时候会被加… 文章目录 个人主页JavaEE系列专栏前言你为什么要学习JVMJVM的作用 JVM的构成5大类1.类加载系统类什么时候会被加载类加载器的分类具体加载类的执行者双亲委派机制如何打破双亲委派机制呢 2.运行时数据区程序计数器虚拟机栈本地方法栈堆 存储空间堆为什么要进行区域划分新生代、老年代对不同区域垃圾回收的称呼堆空间参数设置jvm调优 方法区 3.本地方法接口4.执行引擎5.垃圾回收Stop the world垃圾回收的相关算法垃圾标记阶段垃圾回收阶段 finalize()方法垃圾回收器垃圾回收器的分类CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )G1垃圾回收器Garbage First 持续更新... 个人主页 JavaEE系列专栏 前言
本篇博客主要以总结面试中对JVM知识的考察点
你为什么要学习JVM
通过学习jvm对程序的运行过程更加的了解提高自己对编码的认识扩展自己的知识储备以提高编码规范。它也是中高级程序员必备的知识技能项目管理、性能调优先入门为以后铺路。
JVM的作用
1.将.class字节码文件加载到内存中负责存储数据 2.将字节码解释/编译成计算机能识别的机器码 3.垃圾回收
JVM的构成5大类
类加载系统将字节码文件加载到JVM中运行时数据区虚拟机栈、堆、方法区、本地方法栈、程序计数器本地方法接口负责调用操作系统提供的本地方法执行引擎将字节码 解释/编译成机器码垃圾回收 回收垃圾数据释放内存空间
1.类加载系统 验证不包含以final修饰的静态变量因为会把它视为静态常量
类什么时候会被加载
在类中运行main()时创建对象时使用类中的静态变量反射class.forName(“类地址”)初始化子类。导致父类被加载
【注意:final修饰的是常量不会被加载】【 Car[] carsnew Car[10]; 这种情况也不会被加载 】
类加载器的分类具体加载类的执行者
大致分为两大类引导类加载器、其他类加载器扩展类加载器、应用程序类加载器、用户自定义类加载器
双亲委派机制
当加载一个类的时候会先让上一级类加载器去加载直到找到引导类加载器再向下到扩展类加载器中寻找是否可以加载此类如果不可以就再向下到应用程序类加载器中找如果都找不到就报异常 【好处】:避免了我们自己定义的子类覆盖了系统中的类双亲委派机制会确保优先调用系统中的类。 eg: 自己定义一个String类但仍然会调用系统中的String类而不会调用自己定义的
如何打破双亲委派机制呢
可以通过继承ClassLoader类重写ClassLoader类中的findClass方法实现自定义类加载。 也可以重写 loadClass 方法(是实现双亲委派逻辑的地方,修改他会破坏双亲委派机制, 不推荐) eg: Tomcat服务器自定义类加载规则 2.运行时数据区 程序计数器
特点内存空间小jvm中运行速度最快的区域线程私有的生命周期同线程一样不会有内存溢出问题不会有垃圾回收。 作用记录此线程正在执行的位置以便线程切换后继续执行
虚拟机栈
特点线程私有的存在内存溢出问题不会有垃圾回收用来执行方法栈的基本单位是栈帧一个栈帧就是一个方法 栈帧的结构局部变量表、操作数栈、返回方法调用地址…
本地方法栈
特点也是线程私有的存在内存溢出问题不会有垃圾回收用来执行本地方法就是操作系统提供的方法修饰的关键字是 native,没有方法体。它使用C语言写的。 eg: Object类中的hashCode() 、clone() 、getClass() 、notify() 、notifyAll()、wait() Thread.start()中有一个start0()本地方法、 FileInputStream的read()方法中调用了read0()本地方法 堆 存储空间
存放程序中产生的对象线程共享存在堆溢出是垃圾回收的重点区域。 堆的大小可以调节。 堆区域划分 新生代 伊甸园区存放刚刚创建的对象 幸存者1区进行一次GC存放伊甸园区以及另一个幸存者区存活的对象清空这两个区域的垃圾 幸存者2区进行一次GC存放伊甸园区以及另一个幸存者区存活的对象清空这两个区域的垃圾 老年代 存放超过进行15次垃圾回收仍然存活的对象或 大对象list中有元素List就是大对象垃圾回收频率比新生代慢。默认是15次最大也是15次在对象头中分代年龄占4个比特位可以自己调节参数 比例关系【新生代 : 老年代2 : 1】【伊甸园 : 幸存者1 : 幸存者2 8 : 1 : 1】
堆为什么要进行区域划分新生代、老年代
根据对象存活的生命周期进行分区调整不同区域垃圾回收频率从而提高垃圾回收效率。还可以对不同区域采用不同的垃圾回收器、垃圾回收算法对算法扬长避短。
对不同区域垃圾回收的称呼
Minor GC 新生代垃圾回收 Major GC 老年代垃圾回收 Full GC 整堆收集触发条件老年区满了 或 方法区满了
堆空间参数设置jvm调优
没有调过它是根据程序运行的实际需要来进行参数设置来调整各个区间的比例大小
方法区
存储加载到虚拟机的类信息方法区的大小可以调整参数 方法区是线程共享的会存在内存溢出可以进行垃圾回收但是条件非常苛刻 1.该类实例全部回收 2.该类的类加载器已经回收 3.该类没有在任何地方被引用
3.本地方法接口
本地方法是非java方法是java调用外部环境的方法 java提供一个接口让java可以与其他应用进行交互。
4.执行引擎
是jvm中将字节码 解释/编译为机器码的区域模块。 辨析: 前端编译 将.java文件经过JDK中的javac编译成.class文件 后端编译将.class文件经过JVM中的执行引擎编译成机器码
解释器一行一行的执行代码。效率低但省去了编译时间 eg: 脚本语言html、python… JIT编译器: just in time(及时编译器)将一段代码作为整体进行编译将结果缓存起来直接引用。编译需要花费时间执行效率高适合“热点代码段” java采用的是半解释半编译的方式可以先逐行解释执行到“热点代码”时再对此编译执行并将结果缓存起来两者结合使用提高运行效率。
5.垃圾回收
【垃圾】没有被任何引用指向的对象成为“垃圾”它们会占据内存空间 【内存溢出】内存满了空间不足 【内存泄漏】我们已经不用的对象无法被垃圾回收仍然占据着内存导致内存空间越来越小严重时可引发“内存溢出”
Stop the world
简称STW指GC事件发生的过程中会产生程序的停顿。停顿产生时整个应用程序都会暂停像拍快照。原因是GC需要先标记垃圾为了保证数据一致性以防出现错标、漏标垃圾的情况。
垃圾回收的相关算法
垃圾标记阶段
主要标记哪些对象是垃圾。 引用计数算法统计每个对象被引用的次数从而判断此对象是否是垃圾对象。没有被使用 (缺点 1.需要计数增加空间开销 2.每次需要更新增加时间开销。 3.无法处理循环引用问题(P-A-B-C-A,此时只有P是已知的如果把P断开ABC就形成了一个孤岛导致“内存泄漏”) 可达性分析算法根搜索算法有一组“根”对象为起始点看其他对象是否可达若不可达则被认为是垃圾对象。 名词解释 根虚拟机栈中的引用对象、方法区中的静态变量、所有被synchronized持有的锁对象、java系统中的类 引用链搜索的路径 垃圾回收阶段
回收阶段目前在JVM中三种常见的算法复制、清除、压缩 复制算法 类比两块幸存者区其中一块B是空的将另一块A的存活的对象复制到B把A清空循环往复内存碎片少 清除算法 存活对象位置不变用列表记录一下垃圾对象的位置不会把它们清除掉下次需要使用此内存空间时直接覆盖掉。适用于老年区但因为不移动对象会产生内存碎片。 压缩算法 将存活的对象重新排列到一端将剩余区域直接清理。无内存碎片。效率低适合老年区。 finalize()方法
是Object类中提供的方法对象垃圾回收前会自动调用此方法并且finalize()方法只会被调用一次重写finalize()可能复活对象相当于复活甲第二次被回收时不会调用finalize(),直接被回收。 为此定义虚拟机中对象三种状态 可触及的 就是可达的有引用指向的 可复活的 对象所有引用被释放但是对象可能在finalize()中复活 不可触及的对象的finalize()被调用并没有复活 垃圾回收器
真正进行垃圾回收的执行者。
垃圾回收器的分类
按线程数分类 单线程 适用于简单小型场景只有一个线程进行垃圾回收GC时其他应用程序停止工作(STW) 多线程有多个线程进行垃圾回收 按工作模式分类 独占式就是STW当GC工作时其他线程停止工作 并发式GC线程可以和其他用户线程同时工作 按年龄分代分类 新生代 老年代 CMS垃圾回收器 ( Concurrent Mark Sweep 并发标记清除 )
目标追求低停顿 首个实现垃圾回收线程与其他用户线程同时工作但不是所有的都是并发执行的也会有独占执行的时候 CMS垃圾回收过程 1.初始标记STW 独占 会暂停其他用户线程 2.并发标记 并发 会与其他用户线程同时工作 3.重新标记STW 独占 会暂停其他用户线程 4.并发清除 并发 会与其他用户线程同时工作 G1垃圾回收器Garbage First
适合多核CPU、大内存大型项目 它将每个区域伊甸园、幸存者1、…又划分成了更小的区域哪一个区域垃圾数量多就优先回收哪一个区域它可以做到整堆收集管理。当然它也可以做到并发执行。
持续更新…