1. JVM 是怎么创建对象的?
首先检查 class 文件是否加载;
然后选择内存的分配方式;
分配内存的过程采用 CAS 和 TLAB 来处理并发问题;
最后执行 init 方法初始化零值。
2. JVM 创建对象的时候怎么分配内存?
根据内存是否规整来决定用什么分配方式。内存规整用指针碰撞,内存不规整用空闲列表。堆内存是否规整取决于采用的垃圾回收方式是否会生成内存碎片,如果会,是否会对内存碎片进行整理。
3. 你知道指针碰撞和空闲列表分别是怎么去分配内存的吗?
指针碰撞就是 JVM 会维护一个指针,指针的一边是已用的内存,另一边是未用的内存,给对象分配内存时,指针往未使用内存的一端移动,直到内存刚好达到对象所需的内存大小。
空闲列表就是 JVM 会维护一个列表,列表会记录哪些内存是可用的,给对象分配内存时,就会在这个列表里找一块足够大的内存分配给对象。
4. 你知道哪些内存分配策略?
优先在伊甸园区分配;
大对象直接进入老年代,比如很长的字符串或者元素很多的数组。可以通过 -XX:PertenureSizeThreshold 参数来指定所需内存大于该值的对象就直接进入老年代,不过该参数只对 parNew 收集器和 serial 收集器起作用;
长期存活的对象进入老年代,可以通过 -XX:MaxTenuringThreshold 参数来指定年龄大于该值的对象就进入老年代,该参数默认值是15;
动态年龄判断,即年龄没达到 -XX:MaxTenuringThreshold 指定的值,但是年龄为 x 的所有对象所占的内存加起来大于 from 区和 to 区内存总和的一半,那么年龄大于 x 的对象就会进入老年代。
5. 了解内存分配的担保机制吗?
在进行 YGC 之前,JVM 会检查老年代的最大连续可用空间是否大于新生代所有对象所占内存的总和,如果大于,则可以确保 YGC 是安全的;
如果不大于,那就看 -XX:HandlePromotionFailure 参数是否允许 YGC 失败,如果否,那么就要进行一次 full GC;
如果允许,再接着判断老年代大小是否大于以往每次晋升到老年代对象的平均大小,如果否,那也要进行一次 full GC,如果是,那就可以进行 YGC。
6. 对象创建好后,怎么定位到这个对象?
有两种方式,直接指针和句柄寻址:
句柄寻址就是堆中有一个实例池和一个句柄池,实例池中存放实例数据,句柄池存放两个指针,一个指向实例池,一个指向方法区。优点就是如果对象移动了,存放在栈中的引用不用变,只需改变句柄池中指向实例池的指针即可;
直接指针就是堆内存存放实例数据,同时存放指向方法区的指针,相比句柄寻址这种方式可以减少一次指针定位的开销,我们常用的 sun jdk 和 open jdk 的 Hotspot JVM 采用的就是这种方式。
7. 对象的引用有几种?
对象有四种引用,强软弱虚:
强引用是我们最常用的,内存不足时,JVM 宁愿 OOM,也不会对其进行垃圾回收;
软引用就是当内存不足时,GC 就会对其进行回收;
弱引用就是不管内存够不够,只要 GC 发现了它,就会对其进行回收;
虚引用就跟没有任何引用一样,不决定对象的生命周期,可以用来跟踪 GC 情况;
软、弱引用可以配合 ReferenceQueue 使用,被回收后会加入到这个队列;虚引用必须配合 ReferenceQueue 使用,不然就没有意义。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
8. JVM 参数调优了解过吗?
JVM 调优主要是对堆内存进行调优,它有很多可以设置的参数,常见的参数有:
-Xms:堆内存初始大小,默认值为物理内存的 1/64;
-Xmx:堆内存的最大值,默认为物理内存的 1/4;
-Xmn:新生区的大小,默认占堆内存的 1/3;
-XX:MaxTenuringThreshold:晋升到老年代对象的年龄阈值,默认是 15;
-XX:+PrintGCDetails:打印 GC 的详细信息。
9. 用过哪些 JVM 调优工具?
在 jdk/bin 目录下,有两个工具,jconsole 和 jvisualvm:
jconsole 可以对 JVM 中的线程、内存和类等进行监控;
jvisualvm 是更加全能的分析工具,可以分析内存快照、线程快照、程序死锁和 GC 情况等。
相关推荐
【Java进阶营】Java架构师面试题——JVM性能调优
对JVM内存的系统级的调优主要的目的是减少gc的频率和Full gc的次数。 1.Full gc 会对整个堆进行整理,包括Young、Tenured和Perm。Full gc因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full gc的次数。 2.导致Full gc的原因 1)年老代(Tenured)被写满 调优时尽量让对象在新生代gc时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。 2)持久代Pemanet Generation空间不足 增大Perm
java面试经典题目之内存篇
java会出现内存泄露么,请描述? 会出现,2种情况,1.堆中分配的内存没有将其释放掉,就将所有能访问这块内存的方式都删除掉, 内存对象已经不需要的时候,还仍然保留这块内存和它的访问方式(引用),第一种情况由于在java中垃圾回收机制的使用 得到解决,java内存泄露指第二种例如循环new对象 java堆中的永久代和java堆的结构? java堆不是数据结构意义上的堆(一种有序的树),而...
Java最全面试题->Java基础面试题->JavaSE面试题->JVM面试题
JVM面试题
Java在线笔试编程(2)---模拟内存操作
生命不息,学习不止。题目来自某公司在线笔试编程题。 题目描述如下:物联网技术的蓬勃发展,各种传感器纷纷出现,小B所在的项目组正在开发一个物联网项目,她们在研究设计一种新的传感器,这种传感器有自己的基本处理单元,有一定的自主性,能够进行简单的数据收集、处理、存储、和传输。为降低系统功耗,保证系统可靠性和可控性,她们要对内存进行基本的管理。研究小组计划开发1个实验性内存管理器,实现对内存的分配、释放
不懂就学之挑战成为WorldQuant Brain顾问的第1天
WorldQuant Brain 是由 WorldQuant 公司开发的一个基于人工智能和机器学习的量化研究平台,旨在帮助量化研究员发现和构建有效的投资策略。WorldQuant 是一家全球领先的量化投资公司,专注于利用数据科学、技术和金融工程开发量化交易策略。
esp32-C3固件烧录用户手册
温馨提示:1.esp32-C3 BOOT脚为GPIO9,需要从芯片小板中焊接引出2.芯片小板中已经预留了所有烧录相关的引脚,大家可以按需焊接引线3.程序下载完,使用串口查看log时,需要使用220v供电使用(请务必准守用电安全)。原因:由于插座中包含继电器,计量计等耗电设备,所以usb转串口提供的3.3V电压和电流可能会出现供电不足,表现为usb转串口与电脑连接断断续续,导致无法查看log。
JVM面试题整理-Java内存区域与内存溢出异常、垃圾收集器和内存分配策略
参考: https://blog.youkuaiyun.com/zd836614437/article/details/64126826 https://blog.youkuaiyun.com/u011225629/article/details/49000311 http://www.jsondream.com/2016/12/01/jvm-class-load-object-is-live.html http...
从零到一:EHB-电机复合制动系统的Simulink仿真实战指南
本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。
【高频Java面试题】内存分配
1、基础数据类型直接在栈空间分配; 2、方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收; 3、引用数据类型,需要用new 来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量; 4、方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收; 5、局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆 空间区域等待GC 回收; 6、方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;
openEuler 22.03 安装及配置Gitlab容器
在 openEuler 22.03 上安装及配置Gitlab容器
手把手教你用手机号注册的Apple ID成功登录Developer账户(避坑指南)
本文详细解析了使用手机号注册的Apple ID登录开发者账户时常见的'不符合使用条件'报错问题,并提供了从添加可验证邮箱到设置主账号的四步解决方案。特别针对Apple Developer账户的验证机制,帮助开发者避免因邮箱缺失导致的登录失败,提升账户激活成功率。
面试必知必会系列——Java 内存分配
内存分配,主要指的是在堆上的分配, 一般的,对象的内存分配都是在堆上进行,但现代技术也支持将对象拆成标量类型(标量类型即原子类型,表示单个值,可以是基本类型或String等),然后在栈上分配,在栈上分配的很少见,我们这里不考虑。 Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。 对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。 如下图(来源于《成为Java
SRAM vs RRAM:存算一体芯片选型指南(含最新技术对比)
本文深入对比了SRAM与RRAM在存算一体芯片设计中的核心差异,为硬件工程师和架构师提供实战选型指南。文章从技术本质、性能、功耗、成本及设计风险等多维度剖析,指出SRAM基于成熟CMOS工艺,适合高精度、低延迟场景;而RRAM凭借非易失性和高密度潜力,在超低功耗、固定模型应用中优势明显。决策需综合项目预算、上市时间及技术储备。
Java虚拟机(JVM)面试题(2020最新版)
文章目录Java内存区域说一下 JVM 的主要组成部分及其作用?说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别?队列和栈是什么?有什么区别?HotSpot虚拟机对象探秘对象的创建为对象分配内存处理并发安全问题对象的访问定位句柄访问直接指针内存溢出异常Java会存在内存泄漏吗?请简单描述垃圾收集器简述Java垃圾回收机制GC是什么?为什么要GC垃圾回收的优点和原理。并考虑2种回收机制垃圾...
费雪的未来增长评估:预测颠覆性技术的影响
本文旨在提供一个系统性的框架,用于评估和预测颠覆性技术的增长轨迹。我们将重点关注费雪增长模型(Fisher-Pry Model)这一经典技术扩散理论,探讨其在现代技术预测中的应用价值。文章首先介绍费雪增长模型的基本概念,然后深入其数学原理和算法实现。随后展示实际应用案例,讨论工具资源,最后探讨未来发展趋势。每个部分都包含详细的技术实现和理论分析。费雪增长模型(Fisher-Pry Model):一种描述技术替代过程的S型增长模型,用于预测新技术取代旧技术的速率。
【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
【数据分析】比较SparCC、Pearson和Spearman相关性估计方法在合成组学数据上的表现
Java虚拟机(JVM)面试题(总结最全面的面试题!!!)
文章目录Java内存模型我们开发人员编写的Java代码是怎么让电脑认识的为什么说java是跨平台语言Jdk和Jre和JVM的区别说一下 JVM由那些部分组成,运行流程是什么?说一下 JVM 运行时数据区详细的介绍下程序计数器?(重点理解)详细介绍下Java虚拟机栈?(重点理解)一个方法调用另一个方法,会创建很多栈帧吗?栈指向堆是什么意思?递归的调用自己会创建很多栈帧吗?你能给我详细的介绍Java堆...
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
最全JVM面试题
文章目录1.说一下 JVM 的主要组成部分及组成部分的作用?2.说一下 JVM 的作用?3.深拷贝和浅拷贝4.说一下堆栈的区别?5.队列和栈是什么?有什么区别? 1.说一下 JVM 的主要组成部分及组成部分的作用? 方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域,运行时数据区域就是我们常说的JVM的内存。 类加载子系统:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法区中。 Java堆
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
JVM内存划分、JVM内存分配机制、JVM垃圾回收机制
--------------------------------------------------- JVM内存管理分为两部分: 内存分配 内存回收 ------------------------------------------------------ 内存回收经常也被叫做垃圾回收。(附带资料:JVM面试题超链接、JVM性能调优和 参数说明) *很多人迷惑一个问题,既然J...
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
图解JVM(含面试题)
个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来 微信搜索程序dunk,关注公众号,获取以下整张完整图和思维导图 目录文章总览JVM基础JVM概述JVM的主要功能JVM分类Java内存区域与内存溢出异常本地库接口(JNI)概述为什么使用JNI运行时数据区域PC寄存器Java栈Java堆方法区运行时常量池本地方法栈完整细化JVM图Java程序运行机制HotSpot虚拟机对象探秘对象
Java面试题中高级进阶(JVM篇)
本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!什么是Stop The World?什么是OopMap?说一下JVM 的主要组成部分及其作用?什么是指针碰撞?什么是空闲列表?什么是TLAB?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘*** 12万字的java面试题整理 ***进行垃圾回收的过程中,会涉及对象的移动。为了保证对象引用更新的正确性,必须暂停所有的用户线程,像这样的停顿,虚拟机设计者形象描述为「Stop The World」。也简称为STW。
Java——《面试题——JVM篇》
JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着JVM启动及销毁,另外一 些区域的数据是线程性独立的,随着线程创建和销毁。jvm内存模型总体架构图如下:(摘自oracle 官方网站)JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建 销毁时间。如下图所示,可以分为两大部分,线程私有区和共享区。下图是根据自己理解画的一个 JVM内存模型架构图:JVM内存分为线程私有区和线程共享区线程私有区1、程序计数器。
Java面试题--jvm
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。 JDK和JRE的区别是什么...
JVM 常见面试题进阶
1.1 Java 语言怎么实现跨平台的? 我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。字节码不能直接运行,必须通过 JVM 翻译成机器码才能运行。 JVM 是一个”桥梁“,是一个”中间件“,是实现跨平台的关键。Java 代码首先被编译成字节码文件,再由 JVM 将字节码文件翻译成机器语言,从而达到运行 Java 程序的目的。 1.2 JVM 数据运行区,哪些会...
Java架构师面试题——JVM性能调优
JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会...
【Java进阶营】JVM 内存模型
JVM 内存模型JMM(Java Memory Model) Java 代码: public class MainTest { private int compute() { int a = 1; int b = 2; int c = a * b + 10; return c; } public static void main(String[] args) { MainTest mainTes.
633



被折叠的 条评论
为什么被折叠?



