深入理解JVM10

手撕Java系列--JVM内存模型及垃圾回收机制详解 不同的垃圾回收算法和收集器适用于不同类型的应用场景。选择合适的垃圾回收策略和参数配置,可以显著提升应用程序的性能和稳定性。理解每种算法的工作原理和优缺点,有助于更好地进行调优和故障排除。CMS:适合对响应时间有较高要求的应用,但可能会产生内存碎片。G1:适合大规模应用,能够高效管理大内存,减少停顿时间,但实现复杂。ZGC:适合对响应时间要求极高的应用,能够实现极低的停顿时间,但相对较新,还在发展中。选择合适的垃圾收集器需要根据具体的应用场景和性能需求进行综合考虑。 阅读详情

1.程序计数器

  当前线程所执行的字节码的行号指示器。通过改变计数器的值选取下一条指令。

  分之,循环,跳转,异常处理,线程回复都依赖程序计数器完成。

  多线程轮流切换分配处理器执行时间,在一个确定的时间,一个处理器(多核处理器的一个内核)只会执行一个线程的一条指令。

  为了线程切换后能够恢复到正常的位置,每个线程都有独立的程序计数器,各条线程计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

  Java虚拟机规范:此内存区域是唯一一个没有规定任何OutofMemory情况的区域。

 

2.Java栈

   与程序计数器一样,Java虚拟机栈(Java Vitual Machine Stacks)也是线程私有的,生命周期与线程相同。

  该虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的时候都会创建一个栈针(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。

  每一个方法被调用至执行完成的过程,就对应着一个栈针在虚拟机栈中从入栈到出栈的过程。

  经常有把Java内存区域划分为堆内存Heap和栈内存Stack,这种说法是很粗糙的,实际上远比这复杂。不过上述划分说明了很多程序员关注这两块区域。其中栈内存Stack就是Java虚拟机栈。

  

  局部变量表存放了编译期可知的基本数据类型,对象引用类型,returnAddress类型。

  基本数据类型:boolean,byte,char,short,int ,float,long,double。其中long,double是占两个字节,其余都是占一个字节。

  对象引用类型:对象的起始地址指针。

  returnAddress类型:字节码指令地址。

 

  在编译期时,局部变量表就已经确定了大小。

  在方法运行期间,局部变量表的大小不能改变。

  

  异常:

    StackOverflowError:线程请求的栈深度大于虚拟机允许的深度。

    OutofMemoryError:虚拟机动态扩展无法申请到足够的内存。

3.本地方法栈

   本地方法栈与虚拟机栈所发挥的作用是非常相似的。区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是虚拟机使用到的Native方法服务。

  在虚拟机规范中对本地方法栈中的方法使用的语言,使用的方式和数据结构没有强制的规定。

  具体的虚拟机可以自由的实现。

  在HotSpot虚拟机中,将Java虚拟机栈 和 本地方法栈 合并成了一个。

  异常:

    StackOverflowError

    OutofMemoryError

 

  扩展:Native方法

  参考链接:https://blog.youkuaiyun.com/qiaoguaping9272/article/details/81805920

  譬如:java.lang.Thread setPriority()方法是java实现的,该实现是调用类本地方法setPriority0()。这个方法是C语言实现的,是windows32 SetPriority() API。

4.Java堆

  Java堆是Java虚拟机管理内存中最大的一块区域。

  Java堆是被所有的线程共享的内存区域。在虚拟机启动的时候创建。用来存放所有对象的实例。

  Java虚拟机规范描述:所有对象实例以及数组都要再Java堆上分配。

  Java堆是垃圾收集器管理的主要区域。因此被称为GC堆(Garbage collected Heap).

  根据Java虚拟机中的规定,Java堆可以处于物理上的不连续的内存空间中,但是逻辑连续即可。

  

  异常:

    OutofMemoryError:Java堆是可以扩展的,如果在堆中没有内存完成实例分配,或者堆中无法扩展的时候会抛出该异常。

5.方法区(Method Area)

   方法区与Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类的信息、常量、静态变量、编译后的代码。

  Java虚拟机规范中把方法区描述为堆中的一个部分,但是方法区的别名为Non-Heap(非堆),目的是为了和堆区分。

  在HotSpot虚拟机中GC扩展了垃圾回收的区域,不仅有堆还有方法区。

  Java虚拟机对方法区的限制很宽松,除了和堆一样不需要连续的空间和可选固定或者可扩展以外,还可以选择不实现垃圾回收。

  该区域GC:主要针对常量池的回收(见5.1)和对类型的卸载。

  这部分区域回首效率低,但是很有必要。在Sun公司的BUG列表中,HotSpot(低版本)未对该区域完全回收导致了非常严重的BUG。

 

  异常

    OutofMemoryError:当虚拟机方法区无法满足内存分配需求时,抛出该异常。

5.1运行时常量池(Runtime Constant Pool)

   为啥标注是5.1 因为运行时常量池是方法区的一部分,用来存放编译器生成的各种字面量 和 符号引用。

  对于运行时常量池,java虚拟机没有任何细节的要求,除了保存Class文件中的符号引用外,还会把编译出来的直接引用也存储到运行时的常量池中。

 

  在Java语言中,常量可以在编译时期产生(预置在Class文件中放入常量池)。也可以在运行期间将新的常量放入常量池中。String类的intern()方法。

 

  异常:

    OutofMemoryError,运行时常量池属于方法区的一部分,会受到该方法区内存大小的限制,常量池无法申请到内存时报该异常。

JVM面试指南:掌握这10个问题,大厂Offer轻松拿 Java 虚拟机(JVM)是 Java 平台的核心组成之一,深入理解 JVM 的工作原理、性能优化和垃圾回收机制,对于每一个希望在顶尖科技公司站稳脚跟的 Java 开发者来说,是必不可少的。今天,我们将探讨 10 个最经典的 JVM 面试题目,它们不仅理论深入,而且附带实际例子,可以帮助您在面试中脱颖而出。JVM 作为一个抽象的计算平台,将 Java 程序的字节码转换成机器可以执行的指令。讨论 JVM 性能优化的策略时,您可以分享具体的实例和成果,这不仅证明了您的能力,还展示了您注重实战的态度。 阅读详情

相关推荐

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

手撕java虚拟机

手撕java虚拟机 java的运行离不开jvm,jvm是java运行的基础,然而很少有朋友知道jvm是如何工作的?java的代码如何在jvm中运行?只有当我们了解的java虚拟机的jvm时候,我们才会更能得心应手的解决一些产线问题。 下面的笔记是我前几年系统整理的jvm的学习笔记和资料,通过以下资料你将了解到如下知识点,以及面试高频考点 jvm的工作原理,也就是java字节码在jvm中如何运行。 java对象的内存空间,java如何利用jvm内存空间的,堆栈元空间的划分和使用。 java的垃圾

weixin_43607641的博客 252

Linux环境下离线升级GCC-9.4.0的完整实践指南

本文详细介绍了在Linux环境下离线升级GCC-9.4.0的完整实践指南,包括准备工作、依赖库安装、编译配置及常见问题解决。特别适用于企业内网或安全要求严格的服务器环境,帮助开发者高效完成GCC离线升级,提升编译性能并支持现代编程语言特性。

weixin_29288313的博客 671

手撕 JVM 垃圾收集日志

分布式技术专题+面试解析+相关的手写和学习的笔记pdf《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:[外链图片转存中…(img-ftgXDsAm-1712443304231)]

shenliba的博客 1201

解决Cursor AI工具地域限制报错的方法与原理

地理围栏(GEO-fencing)是现代云服务常用的访问控制技术,通过IP地址库匹配、支付系统验证等方式实现区域限制。在AI编程工具领域,这种技术常导致类似Cursor出现的'unsupported country region'报错。从技术实现看,服务商会综合HTTP头信息、时区设置等多维度数据进行地理位置判断。开发者可通过调整网络出口、配置本地模型或使用企业版等方案解决。本文以Cursor为例,详细分析了AI工具地域限制的底层原理,并提供了包括Ollama本地部署在内的多种工程实践方案,特别适合需要稳定

weixin_30820077的博客 971

晶振(晶体振荡器)测试方法详解

晶振测试方法分为无源和有源两种类型。无源晶振(两脚)需用示波器测试波形,重点关注正弦波形状、200mV-1.5Vpp幅值和频率精度;有源晶振(四脚)通电后直接输出方波。测试要点包括:示波器使用10X探头、AC耦合,带宽需5倍于晶振频率;万用表可初筛短路/开路;替换法是工程最有效方法。常见故障排查顺序:供电→复位→焊接→型号→负载电容→波形观察→更换晶振→MCU配置。负载电容需按公式计算匹配,示波器观察是核心测试手段。

jiujiujinyuxi的博客 928

救命!面试官问“你会修JVM吗”?吃透这8道题直接封神

当面试官抛出“你会修JVM吗”这种灵魂拷问,别慌!这背后暗藏着对Java底层原理、性能调优和故障排查能力的深度考察。今天用8道经典面试题,带你从JVM基础直通调优实战,下次再被问倒,反手甩出这些答案直接惊艳全场!

Minoz_wl的博客 408

AB SCIEX质谱数据分析实战:从PeakView入门到精通

质谱分析是现代生命科学和药物研发中不可或缺的核心技术,它通过测量离子的质荷比来鉴定和定量化合物。其基本原理是将样品离子化后,在电场和磁场中按质荷比分离,最终形成质谱图。这项技术的核心价值在于能够从复杂混合物中高灵敏度、高特异性地获取化合物的定性和定量信息,广泛应用于代谢组学、蛋白质组学、环境监测和药物分析等领域。在实际工作中,高效的数据处理平台至关重要。以AB SCIEX质谱仪生成的.wiff文件为例,其原始数据需要专业软件进行解析。PeakView软件正是这样一个综合平台,它集成了高级数据处理、谱图解析和

weixin_29053577的博客 309

【JVM】字节码技术:手撕 多态执行原理

图解 多态原理

知识输出、记录学习 486

1.2 Spring AI V1.1.2版本 架构全景:模块拆解与设计哲学

Override// 检查请求的 Token 数量throw new TokenLimitExceededException("请求超出 Token 限制");@Override// 记录实际消耗的 Token@Override// 最先执行// 接口// 不同实现// 使用方无需改变定义抽象,保证可移植性提供 Fluent API,提升开发体验Advisor 机制提供扩展点,支持灵活定制模块化设计让你只引入需要的依赖自动配置。

小林夕程的博客 220

黑猫带你学Nand第8篇:NandFlash的供电情况详解

是指在任何工作条件下,设备允许的最大电压、电流、功率以及温度等参数的界限值。

黑猫奥利奥的博客 1150

【jvm系列-10】深入理解jvm垃圾回收器的种类以及内部的执行原理

深入理解jvm垃圾回收器的种类

zhenghuishengq的博客 4561

基于上下文的 Listwise 重排模型(一):miRNN

2018年阿里团队提出的miRNN(Mutual Influence aware RNN)模型,首次将电商搜索重排建模为全局优化问题,通过RNN捕捉商品序列的相互影响,结合Beam Search生成最优排序,在淘宝搜索中实现GMV(商品交易总额)提升5%的突破。本文将结合论文细节与通俗案例,拆解这一工业级重排框架的核心逻辑。

进一步有进一步的欢喜~ 1918

10. JVM之深入理解方法区

《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpot JVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。 所以,方法区看作是一块独立于Java堆的内存空间。

weixin_45267102的博客 329

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入理解JVM(10)——字节码指令

目录 1.未归类系列A 2.const系列 3.push系列 4.ldc系列 5.load系列 5.1 load系列A 5.2 load系列B 6.store系列 6.1 store系列A 6.2 store系列B 7.pop系列 8.栈顶元素数学操作及移位操作系列 9.自增减指令 10.类型转化系列 11.比较指令系列A 12.有条件跳转指令系列A 13.无条件...

波波鱼的博客 923

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《深入理解JVM》10-垃圾回收

本系列的第七篇写过一次垃圾回收,今天看起来优点脏乱差,贻笑大方。这节课是对郑雨迪老师的课程总结,希望对大家有点帮助。 在第五节的时候我们已经总结过JVM的内存设计了 就是上面这张图,相比大家对这个图已经熟记于心了,我们知道新生成的对象都会被分配到堆这块区域,但是随着系统的不断运行,堆内的对象越来越多,这个时候就要清理一下,回收无用的对象的内存空间,分配给新创建的对象。这就是垃圾回收机制,Java语言能够如此的风靡有很大一部分原因是JVM自带了优秀的垃圾回收器,让开发人员不用关注内存空间分配的问题。

David_lou的专栏 461

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解JVM虚拟机10:JVM常用参数以及调优实践

本文转自[JVM常用参数以及调优实践](https://blog.youkuaiyun.com/a724888/article/details/78367780)       JVM常用参数选项   jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/techne...

weixin_43192732的博客 498

深入理解 JVM 虚拟机之垃圾回收算法(JVM 虚拟机篇 - 10)

JVM 垃圾回收算法是用于确定哪些内存中的对象是垃圾(即不再被程序使用)以及如何回收这些垃圾对象所占用内存的方法。不同的垃圾回收算法有不同的特点和适用场景。标记 - 清除算法(Mark - Sweep)这是最基础的垃圾回收算法。其过程分为 “标记” 和 “清除” 两个阶段。在标记阶段,垃圾回收器从根对象(GC Roots,如之前介绍的虚拟机栈中引用的对象、方法区中类静态属性引用的对象等)开始遍历所有可达对象,并对其进行标记。在清除阶段,回收器会清理未被标记的对象,释放它们所占用的内存。

m0_57836225的博客 374

深入理解JVM(10)——Class文件结构

什么是“JVM”的无关性 Java具有平台无关性,也就是任何操作系统都能够运行Java代码,之所以能够实现这一点,是因为Java运行在虚拟机上,不同的操作系统都有各自的Java虚拟机,从而实现一次编译,到处运行。 JVM不仅具有平台无关性,还具有语言无关性。平台无关性是指不同的操作系统都有各自的JVM来运行Java代码,但语言无关性是指Java虚拟机能运行除了Jav...

weixin_30832351的博客 86

java 10 java写 jvm_Java进阶专题(十) 深入理解JVM(上)

前言​本章节属于Java进阶系列,前面关于设计模式讲解完了,有兴趣的童鞋可以翻看之前的博文,后面会讲解JVM的优化,整个系列会完整的讲解整个java体系与生态相关的中间件知识。本次将对jvm有更深入的学习,我们不仅要让程序能跑起来,而且是可以跑的更快!可以分析解决在生产环境中所遇到的各种“棘手”的问题,比如运行的应用卡住了,日志不输出,程序没有反应,CPU负载突然升高,多线程应用下,如何分配线程数...

weixin_39999209的博客 112

【深入理解JVM】第10~13章 编译期优化、线程安全、锁优化 笔记

打算把这4章整理到一篇博文中来讲,因为这几章内容都比较偏理论和底层,每章内容也不算很多,一般开发者接触也十分有限,这里主要挑那些比较有意义的来讲讲。第10章1、语法糖所谓语法糖其实就是语言提供了一些小技巧来帮助开发者更快地编写代码,而这些技巧不会提供太多实质上的改进,而且如果过度依赖,会容易看不清其真正的面目。这里讲几个Java中常见的语法糖。1、泛型与类型擦除。Java的泛型是依靠擦除来实现的,这

qq_22123283的博客 315

2020-02-10 深入理解JVM读书笔记之类加载器加载职责

Bootstrap ClassLoader: 加载$JAVA_HOME/lib 核心包 Extension ClassLoader: 加载$JAVA_OHOME/ext 扩展包 Application ClassLoader: 加载 ClassPath ,也就是我们的项目 User ClassLoader: 程序猿自己实现的类加载器,加载自定义的类 双亲委派模型: 优先托父类...

qq_29499107的博客 5734

简单描述你所理解的java虚拟机的工作原理_10道JVM常见面试题解析(附答案)

1.什么情况下会发生栈内存溢出?(1)思路描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。(2)我的答案栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出Stack...

weixin_33218612的博客 144
上一篇: 【深入理解JVM】学习笔记——-9、指令
下一篇: 2018-2020互联网寒冬我们能做些什么?
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值