JVM原理

article/2025/8/19 23:03:09

JVM原理

一.jvm简介
JVM是Java Virual
Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,时Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

二.JRE/JDK/JVM是什么关系:
JRE是Java运行环境,即(Java Runtime
Environment),也就是Java平台。所有的Java程序都要在JRE下才能运行。
JDK是开发工具包,即(Java Development Kit),它是程序开发者用来编译、调试Java程序,它也是Java程序,也需要JRE才能运行。
JVM是Java虚拟机,即(Java Virual Machine),它是JRE的一部分,一个虚构出来的计算机,它支持跨平台。

三.jvm原理
JVM是Java核心和基础,在Java编译器和os平台之间的虚拟处理器。他可以在上面执行Java的字节码程序。Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台的机器码,通过特定平台运行。
在这里插入图片描述
四.JVM体系结构
类加载器:加载class文件;
执行引擎:执行字节码或者执行本地方法
运行时数据区:包括方法区、堆、Java栈、PC寄存器、本地方法栈
在这里插入图片描述
五.JVM运行时数据区
1.pc寄存器:用于存储每个线程下一步将执行的jvm命令
  2.栈:栈是线程私有的,每个线程创建的同时都会创建的同时都会创建JVM栈,JVM栈中存放当前线程中的局部基本类型的变量;
  3.堆:它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。堆是JVM所有线程共享的。
  4.方法区:存放了所加载的类信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息;通过class对象中的getName等方法来获取信息时,实际这些数据是来源于方法区,方法区是全局共享的。
  5.运行时常量池:存放类中固定的常量信息、方法和Field的引用信息等,其空间是从方法区中分配。
  6.本地方法栈:JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

六.如何判断对象是否存活
1.引用计数法:给对象中添加一个引用计数器,当一个地方引用了对象,计数加1;当引用失效,计数器减1;当计数器为0表示该对象已死、可回收;但很难解决循环引用问题;

2.可达性分析:通过一系列称为“GC Root”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象GC Roots没有任何引用链相连,则证明此对象已死、可回收。Java中可以作为GC Roots的对象包括:虚拟机栈中引用的对象、本地方法栈中native方法引用的对象、方法区静态属性引用的对象、方法区常量引用的对象。

七.JVM垃圾回收
1.对新生代的对象的收集称为minor GC;
2.对老年代的对象的收集称为full GC;
3.程序中主动调用System.gc()强制执行的GC为full GC;
4.强引用:默认情况下,对象采用的均为强引用;
5.软引用:适用于缓存场景(只有在内存不够用的情况下才会被回收)
6.弱引用:在GC时一定会被GC回收
7.虚引用:用于判断对象是否被GC

八.垃圾收集算法
1.标记—清除算法:有两点不足,一个效率问题,标记和清除过程都效率不高;一个是空间问题,标记清除后会产生大量不连续的内存碎片;
2.复制算法:解决了内存碎片问题,但是内存利用率低;
3.标记整理算法:解决了内存碎片问题

九.分代收集算法
1.新生代:每次GC时都会有大量对象死去,少量存活,使用复制算法;新生代又分为Eden区、Survivor(Survivor from、Survivor to)大小比例默认为8:1:1;JVM给每个对象定义一个对象年龄计数器,乳沟对象在Eden出生并经过第一个Minor GC后仍然存活,并且能被Survivor容纳,将被移入Survivor并且年龄设定为1.每熬过一次Minor GC,年龄就加1,当它的年龄到了一定程度(默认15岁,可以通过XX:MaxTenuringThreshold来设定),就会移入老年代;如果Survivor相同年龄所有对象大小的总和大于Survivor的一半,年龄大于等于x的所有对象直接进入老年代,无需等到最大年龄要求。
2.老年代:老年代中的对象存活率高、没有额外空间进行分配,就是用标记—清除或标记—整理算法;大对象可以直接进入老年代,JVM可以配置对象达到阈值后进入老年代的大小(-XX:PretenureSizeThreshold)

垃圾收集器
Serial收集器:是最基本、历史最久的收集器,单线程,并且在收集是必须暂停所有的工作线程;
ParNew收集器:是Serial收集器的多线程版本;
Parallel Scavenge收集器:新生代收集器,并行的多线程收集器。它的目标是达到一个可控的吞吐量,这样可以高效率的利用CPU时间,尽快完成程序的运算任务,适合在后台运算;
Serial Old收集器:Serial 收集器的老年代版本,单线程,主要是标记—整理算法来收集垃圾;
Parallel Old收集器:Parallel Scavenge的老年代版本,多线程,主要是标记—整理算法来收集垃圾;Parallel Old 和 Serial Old 不能同时搭配使用,后者性能较差发挥不出前者的作用;
CMS收集器:收集器是一种以获取最短回收停顿时间为目标的收集器;基于标记清除算法,并发收集、低停顿、运作过程复杂(初始标记、并发标记、重新标记、并发清除)。
CMS收集器有3个缺点:
1.对CPU资源非常敏感(占用资源);
2.无法处理浮动垃圾(在并发清除时,用户线程新产生的垃圾叫浮动垃圾),可能出现“Concurrent Mode Failure”失败;
3.产生大量内存碎片  
G1收集器:
特点:
分代收集,G1可以不需要其他GC收集器的配合就能独立管理整个堆,采用不同的方式处理新生对象和已经存活一段时间的对象;
空间整合:采用标记整理算法,局部采用复制算法(Region之间),不会有内存碎片,不会因为大对象找不到足够的连续空间而提前触发GC;
可预测的停顿:能够让使用者明确指定一个时间片段内,消耗在垃圾收集上的时间不超过时间范围内;


http://chatgpt.dhexx.cn/article/a2IBhrRp.shtml

相关文章

JVM原理详解

主题内容: 1.JVM 内存区域概览 2.堆区的空间分配是怎么样?堆溢出的演示 3.创建一个新对象内存是怎么分配的? 4.方法区 到 Metaspace 元空间 5.栈帧是什么?栈帧里有什么?怎么理解? 6.本地方法栈 7.程序…

JVM的运行原理

目录 1.概念 2.JVM运行机制 3.JVM执行流程 4.JVM运行时数据区 什么是线程私有? OOM(内存溢出) 4.1 堆:也叫运行时数据区,线程共享 4.2 方法区:线程共享 4.3 Java虚拟机栈:线程私有,描…

JVM的原理

JVM原理(一) 1、JVM总体结构图 2、JVM堆结构图以及分代 复制算法: 1、新生成的对象存放在Eden区和from区 2、当Eden区内存不够,虚拟机将发起一次MinorGC 3、GC进行时,Eden区中所有存活的对象都会被复制到to区 4、年龄阀值达到15的会被放到老年…

JAVA虚拟机JVM工作原理

提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行。但具体原理是咋样的?身为JAVA小白,岂可不知! 一、原理 二、结构 1、类加载器 2、执行引擎 3、运行时数据区域一、原理 JVM实现…

JVM 运行机制及其原理

最近出去面试,总被问到Java JVM相关的东西,什么JVM的内存模型、JVM的内存分配、内存回收、内存回收算法…搞得我一头雾水,早些年还看过一些,蹭着有时间给大家也给自己总结下JVM相关的知识。 JVM JVM是Java Virtual Machine&…

JVM原理-超详细总结

JVM概念 JVM是java的核心和基础在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经…

2022年iOS最新面试(底层基础)问题答案

文章目录 Runloop 1、RunLoop 的本质是什么?2、Runloop和线程是什么关系?3、Runloop的底层数据结构是什么样的?有几种 运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么…

2019年面试必备:iOS 面试题大全(附答案)

这个栏目将持续更新–请iOS的小伙伴关注! 1、多线程的应用 2、GCD实现多个请求都完成之后返回结果 3、A、B两个int数组,得到A数组中B数组不包含的元素 4、事件传递链,页面上一个按钮,按钮和它的superView有一样的action,为什么只执行button的…

iOS 多线程面试题

没有比这里更全的了,看我就好了 面试官😃 :你了解进程吗?谈谈你对进程和线程的理解? 不谈进程,线程无从谈起。要了解什么是线程,我们先需要理解什么是线程。 秒懂百科 😃 以上百科&…

2020,300道高级iOS开发面试题(最新整理)

这个栏目将持续更新–请iOS的小伙伴关注! 一:知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新i…

iOS经典面试题大全

1.INTERVIEW 共勉 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 与2800i…

2021年,整理的iOS高频面试题及答案(总会有你需要的)

推荐阅读:关于iOS面试题汇总(栏目持续更新) 各位最近应该忙于跳槽与面试吧,毕竟金三银四,珍惜好机会,预祝大家面试顺利通过,迎接大厂offer。有需要资料可以私聊我了解 从输入url到页面展示到底发生了什么 1、输入地…

iOS面试题 2016版

2015-1-3 达内纪老师 GitHub,CSDN博客 说明: 最近为达内学员整理面试题。发现网上的面试题和答案基本都是抄来抄去的,甚至很多答案都是错误的。 所以整理了常见的面试题,对答案重新进行了筛选整理。 如果答案有错漏或者更好的答案…

iOS面试题系列之常见算法

iOS面试中熟悉常见算法 1、 对以下一组数据进行降序排序(冒泡排序)。“24,17,85,13,9,54,76,45,5,63” int main(int argc, char *argv[]) {int …

(2021年)iOS面试题及答案,以及添加Flutter 面试问题,Swift面试题

面试题的深入解析;​​​​​​​ 一,内存管理在实际开发中的应运。 1.UITableView的数据条数太多时会消耗内存,可以给UITableViewCell、UICollectionViewCell、UITableViewHeaderFooterView设置正确的复用ID,充分复用。 2.有…

iOS中高级面试题

https://blog.csdn.net/u014600626/article/details/102923706 iOS基础 1:讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 atomic 修饰的属性(不重载设置器和访问器)只保证了对数据读写的完整性,也就是原子性&am…

ios 面试题

1 为什么block要用copy修饰? 答:因为block在创建的时候,它的内存是分配在栈上的,而不是在堆区。栈区的特点是:对象随时有可能被销毁,一旦被销毁,在调用时就会造成崩溃。所以我们要使用copy吧它拷…

2022年 iOS面试题总结

前言 都说今年互联网行情很差,iOS行情更差。但到底怎么样呢,不能光听别人说,而要自己走出去看一看。我的面试的阶段基本都在3月份,准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会,前期由…

iOS面试题(七)

iOS面试题(一) iOS面试题(二) iOS面试题(三) iOS面试题(四) iOS面试题(五) iOS面试题(六) iOS面试题(七) iOS面…

iOS基础面试题(一)

kaikaijia同学私信我,说想加群,我就建个iOS开发群,大家做技术交流和资源,群号:241048287(已满),群号2 :340957379(已满) 群号3:370041534 (已满) 有兴趣的同学可以加群,验证信息:iOS+姓名。 所有的群都已到人数上限,本着“与时俱进”精神,建了个"iOS面试&…