JVM_1

【Java面试题】JVM(26道) 阅读详情
JVM
运行时数据区域
  1. 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。是线程私有”的内存。
  2. Java虚拟机栈:与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧 ,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
  3. 本地方法栈:本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
  4. Java堆:对于大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
分代回收

HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的,所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

常见的垃圾回收机制
  1. 引用计数法:引用计数法是一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。虽然管理引用计数的开销不大,但这项开销在整个程序生命周期中将持续发生。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象引用计数为0时,就释放其占用的空间。
  2. 可达性分析算法:这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。
G1和CMS的比较
  1. CMS收集器是获取最短回收停顿时间为目标的收集器,因为CMS工作时,GC工作线程与用户线程可以并发执行,以此来达到降低手机停顿时间的目的(只有初始标记和重新标记会STW)。但是CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。
  2. CMS仅作用于老年代,是基于标记清除算法,所以清理的过程中会有大量的空间碎片。
  3. CMS收集器无法处理浮动垃圾,由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。
  4. G1是一款面向服务端应用的垃圾收集器,适用于多核处理器、大内存容量的服务端系统。G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短STW的停顿时间,它满足短时间停顿的同时达到一个高的吞吐量。
  5. 从JDK 9开始,G1成为默认的垃圾回收器。当应用有以下任何一种特性时非常适合用G1:Full GC持续时间太长或者太频繁;对象的创建速率和存活率变动很大;应用不希望停顿时间长(长于0.5s甚至1s)。
  6. G1将空间划分成很多块(Region),然后他们各自进行回收。堆比较大的时候可以采用,采用复制算法,碎片化问题不严重。整体上看属于标记整理算法,局部(region之间)属于复制算法。
  7. G1 需要记忆集 (具体来说是卡表)来记录新生代和老年代之间的引用关系,这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率。所以 CMS 在小内存应用上的表现要优于 G1,而大内存应用上 G1 更有优势,大小内存的界限是6GB到8GB。
哪些对象可以作为GC Roots
  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  2. 方法区中类静态属性引用的对象。
  3. 方法区中常量引用的对象。
  4. 本地方法栈中JNI(即一般说的Native方法)引用的对象。
GC中Stop the world(STW)

在执行垃圾收集算法时,Java应用程序的其他所有除了垃圾收集收集器线程之外的线程都被挂起。此时,系统只能允许GC线程进行运行,其他线程则会全部暂停,等待GC线程执行完毕后才能再次运行。这些工作都是由虚拟机在后台自动发起和自动完成的,是在用户不可见的情况下把用户正常工作的线程全部停下来,这对于很多的应用程序,尤其是那些对于实时性要求很高的程序来说是难以接受的。

但不是说GC必须STW,你也可以选择降低运行速度但是可以并发执行的收集算法,这取决于你的业务。

垃圾回收算法
  1. 停止-复制:先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的对象全部都是垃圾。当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑排列,然后就可以按前述方法简单,直接的分配了。缺点是一浪费空间,两个堆之间要来回倒腾,二是当程序进入稳定态时,可能只会产生极少的垃圾,甚至不产生垃圾,尽管如此,复制式回收器仍会将所有内存自一处复制到另一处。
  2. 标记-清除:同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当它找到一个存活的对象,就会给对象一个标记,这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开始。在清理过程中,没有标记的对象会被释放,不会发生任何复制动作。所以剩下的堆空间是不连续的,垃圾回收器如果要希望得到连续空间的话,就得重新整理剩下的对象。
  3. 标记-整理:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。
  4. 分代收集算法:把Java堆分为新生代和老年代,然后根据各个年代的特点采用最合适的收集算法。新生代中,对象的存活率比较低,所以选用复制算法,老年代中对象存活率高且没有额外空间对它进行分配担保,所以使用“标记-清除”或“标记-整理”算法进行回收。
Minor GC和Full GC触发条件
  • Minor GC触发条件:当Eden区满时,触发Minor GC。
  • Full GC触发条件:
    1.调用System.gc时,系统建议执行Full GC,但是不必然执行
    2.老年代空间不足
    3.方法区空间不足
    4.通过Minor GC后进入老年代的平均大小大于老年代的可用内存
    5.由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
jvm内存模型,1.6 1.7 1.8哪里不同 JVM 因为热爱,所以拼搏。 –RuiDer XI. 前导必备 Java基础 JVM内存模型 XII. JVM内存模型 说明一下,也是我本人的亲身感受。如果你是入门JVM新手,之前接触过JVM方面的东西或者你个人存有自己对于JVM理解,我希望你暂时先屏蔽他们,不然会带来很大的干扰。 YI. Java内存区域划分 1.程序计数器(P... 阅读详情

相关推荐

jdk1.8之后的jvm架构

JDK 1.8(即Java 8)及之后版本的JVM架构有一些重要的变化,特别是内存模型方面的调整。

weixin_42507103的博客 498

ActiveMQ初启动报错 JVM_Bind

ActiveMQ初启动报错

FATCATS博客 1419

JVM g1 部分参数

g1 部分参数 配置项 意义 -XX:CICompilerCount=3 JVM最大并行编译线程数 -XX:ConcGCThreads=1 GC并发阶段使用的线程数 -XX:+DisableExplicitGC 禁止代码中显示调用GC -XX:G1HeapRegionSize=8388608 单位byte,此处是8M,设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。目标是根据最小的 Java 堆大小划分出约 2048 个区域。每个Region的状

1644

JVM 常见面试题及解析(2024)

解析:JVM(Java Virtual Machine)即 Java 虚拟机,是一种可以执行 Java 字节码的虚拟计算机。它的主要作用是屏蔽不同操作系统和硬件之间的差异,使得 Java 程序能够在各种平台上 “一次编写,到处运行”。通过将 Java 源文件编译成字节码文件(.class),然后由 JVM 在不同的平台上进行解释或编译执行,实现了跨平台性。

爱好技术的小老头 1万+

深入剖析JVM及G1垃圾回收器

Java开发工具包(JDK)内置了多个用于性能监控的工具,如jstat、jmap、jstack、jconsole和VisualVM等。这些工具提供了不同层次的监控能力:jstat: 用于监控JVM的统计信息,包括类加载、垃圾收集、即时编译情况等。jmap: 用于获取内存映射文件或堆内存的快照。jstack: 用于生成JVM当前时刻的线程快照。jconsole: 提供了一个图形化的监控界面,可以查看JVM的内存使用情况、线程状态等。VisualVM。

weixin_32836713的博客 790

大数据面试题(附答案,持续更新...)

说说对hadoop的理解,都有哪些组件,分别是干什么的 还了解大数据其他组件嘛? kafka在什么地方需要用到zookeeper 了解HBase吗? 说下spark中的transform和action 为什么spark要把操作分为transform和action spark中有了RDD,为什么还要有Dataframe和DataSet? 了解函数式编程吗?说下c/c++和scala这种函数式编程语...

xiaozhaoshigedasb的博客 9947

JVM常见面试题

JVM场景面试

给自己一个smile 1万+

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

一个程序员2年外包工作的跳槽之路

最近入职到了新公司,一直想到把跳槽的事情理一理,而公司离住的地方很远,上班下班4小时花在路上,没时间腾出来。 进入正题~ 1、外包 外包,什么是外包,啥又叫外包公司呢 外包的本意是一种战略管理服务模式,但是由于公司工作环境、待遇等问题,逐渐在IT行业的同行们眼中有点灰色。外包公司很多,如中软、软通、华微、易思博、赛亿、博彦、文思海辉等。 如上面所示,个人不想进外包,所

whyherry的博客 6万+

笔试题-2023-芯动-数字IC设计【纯净题目版】

笔试题-2023-芯动-数字IC设计【纯净题目版】

w0shishabi的博客 6395

基于深度学习的异常检测实战:从自编码器到GAN

本文通过一个完整的实战案例,展示了如何使用自编码器和GAN进行异常检测。我们详细介绍了数据准备、模型定义、训练和评估的步骤,并提供了可运行的代码。希望本文能为读者在实际项目中应用异常检测技术提供实用的指导和启发。

Programming Talk 242

java jvm 1.6,探究JVM1.6与JVM1.5性能差距(1)

本文向大家描述一下JVM1.6与JVM1.5性能的差距,通过测试工具VolanoBenchMark,我们能清楚的看到两者的差距,以及新软件的进步。其实这本来是个WebChat的软件,制作者在ChatApp的功能基础上发展出这个对JVM性能测试的小软件,用来在不同硬件配置的机器上或者是不同Kernel的操作系统上对不同的JVM进行性能测试。它是通过对服务器建立多个客户端的连接来测量客户端程序广播批量...

weixin_39531178的博客 213

2025年最新雷电模拟器9.22安装Magisk面具和LSPosed框架完整图文教程 文章末尾附所需软件下载

操作环境:雷电模拟器9.0.22 虚拟系统版本android 91、设置-其他设置-Root权限-开启2、设置-性能设置-System.vmdk可写入3、安装Magisk-18a0b94a-delta(25205).apk,运行并给予root权限4、选择右上角安装弹出“允许“magisk Delta”访问您设备上的照片、媒体内容和文件吗?“选择允许,然后结束magisk进程。5、从新运行magisk选择右上角安装-选择修补boot镜像中的vbmeta和安装到Recovery。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7093

探究JVM1.6与JVM1.5性能差距(1)

本文向大家描述一下JVM1.6与JVM1.5性能的差距,通过测试工具VolanoBenchMark,我们能清楚的看到两者的差距,以及新软件的进步。其实这本来是个WebChat的软件,制作者在ChatApp的功能基础上发展出这个对JVM性能测试的小软件,用来在不同硬件配置的机器上或者是不同Kernel的操作系统上对不同的JVM进行性能测试。它是通过对服务器建立多个客户端的连接来测量客户端程序广播批量

developerFBI的专栏 2806

【人工智能时代】- 一键部署本地AI大模型

Ollama是一个开源项目,致力于简化大型语言模型(LLM)的本地部署过程。它允许用户在自己的硬件上运行和测试最新的语言模型,无需依赖云服务。Ollama提供了一个类似于OpenAI的API接口,使得开发者可以轻松地在自己的应用程序中集成大型语言模型。此外,Ollama WebUI为用户提供了一个友好的界面,用于管理和与模型进行交互。

xiaoli8748的专栏 2379

Unity 之如何使用Pico4u锚点功能实现一个世界锁GameRoot

摘要 空间锚点技术是混合现实(MR)应用的核心,能永久记录虚拟物体的空间位置。文章介绍了在Unity中使用Pico SDK实现空间锚点的完整流程:1)环境配置需安装XR模块和Pico SDK;2)关键操作包括启动空间感知、创建/删除/查询/更新锚点;3)提供了经典应用案例,通过GameRoot节点实现场景固定和锚点同步。源码展示了基于XR交互工具包的锚点抓取与位置更新实现,为MR开发提供了实用参考方案。

TxNet 972

JVM之1.7于1.8内存区别

JVM之1.7于1.8内存区别 jvm的内存模型在1.7和1.8有较大区别。 1、jdk1.7的堆内存 Young 年轻代 Young区被划分为三个部分,Eden区和两个大小严格相同的Survivor区,其中,Survivor区间中,某一时刻只有其中一个是被使用的,另一个留做垃圾收集时复制对象用,在Eden区间变满的时候,GC就会将存活得的对象移到空闲的Survivor区间中,根据JVM的策...

T_chuxin的博客 2521

深入解析:使用Python进行T矩阵散射计算的完整指南

在物理学和工程学中,散射是一个至关重要的概念。当波(无论是光波、声波还是其他类型的波)遇到一个障碍物时,它会在多个方向上散开。为了理解和预测这种行为,我们需要进行数学建模和计算。其中,T矩阵方法是一种非常有效的工具。在开始计算之前,我们需要定义一些基础函数。"""计算T矩阵的一个元素。参数:- wave_vector: 波矢- scatterer_position: 散射体的位置- scatterer_properties: 散射体的性质(如大小、形状等)返回:- T矩阵的一个元素。

qq_38334677的博客 1054

【1】JVM1-10

目录 知识点1:栈帧的产生和销毁,什么时候出OOM错误? 知识点2:JVM优化 知识点3:什么情况下会导致YGC,怎么控制伊甸园区的比例 知识点4:G1垃圾回收机制了解吗? 知识点5:获取JAVA对象占用的内存大小 知识点6:Java内存模型 知识点7:垃圾回收算法 知识点8:创建对象在堆中的存放,新生代、年老代用的算法 知识点9:永久代 知识点10:什么情况下栈溢出?堆溢出?...

19年的努力,并不是说说而已! 12万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jvm内存配置参数_JVM之G1回收器和常见参数配置

过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器。还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置。G1回收器G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。我们会想一下我们上次课说的parNew+CMS回收器已经很厉害了,但是我们的服务器是那种超...

weixin_39747399的博客 2904

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

探究JVM1.6与JVM1.5性能差距(2)

JVM1.6与JVM1.5测试结果: MustangJVM1.6β:9011.333 TigerJVM1.5:9335.333 JVM1.5的还是比JVM1.6β的性能好。个人有点不是很理解,当然这里没有去考虑使用Server还是Client以及其他因素,但作为一个普通的应用程序开发者,β版的1.6JVM的效能并没有让我们看到惊喜。 横向对比JVM1.6与JVM1.5性能后

developerFBI的专栏 1614

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基于 java1.8 的 JVM 参数

Java 1.8 中的 JVM 参数主要分为内存配置、垃圾回收、日志配置、调试诊断和系统属性等类别。内存配置参数包括堆内存设置(-Xms、-Xmx)、新生代大小(-Xmn)、Eden与Survivor区比例(-XX:SurvivorRatio)、老年代与新生代比例(-XX:NewRatio)以及线程栈大小(-Xss)等。这些参数用于优化内存分配,避免OOM错误,并适应不同应用场景(如Web服务或缓存服务)。合理配置这些参数能够提升JVM性能,减少GC开销。

工作难点和娱乐项目,总结与分享 1563

JVM1.8对象的分配

深入理解JVM探讨的是JVM1.7, 许多东西在1.8中都已经不一样 比如书中的P91-P93对象优先在Eden分配。 及下面这段代码 public class JVM { private static final int __1MB = 1024*1024; public static void main(String[] args) { // 10M youn...

一棵藤井树丶 266

JVM G1

http://youzhixueyuan.com/detailed-explanation-of-jvm-g1.html JVM垃圾收集器发展历程 第一阶段,Serial(串行)收集器 在jdk1.3.1之前,java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是...

qq_38007708的博客 478

JVM 内存结构|1.7 1.8 区别详解

目录 概述 JVM内存分配 各个分区介绍 1.7和1.8区别 概述 字节码文件生成:首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。 在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理.

一名路过的小码农啊 5805

【JVM篇03】:Java1.7和1.8的JVM内存结构对比详解

本文对比了Java 1.7和1.8版本中JVM内存结构的关键变化。JVM内存分为线程共享区域(堆、方法区)和线程私有区域(虚拟机栈、本地方法栈、程序计数器)。主要差异在于方法区的实现:1.7采用堆内存中的永久代,存在内存限制和GC效率问题;1.8改用本地内存的元空间,突破了内存限制,降低了OOM风险。字符串常量池在1.7时已移至堆内存,1.8保持该位置。这一改进使JVM更稳定高效。

lyh2004_08的博客 1419
上一篇: zookeeper、redis、mysql相关面试题
下一篇: JVM_2
小小小跟班
博客等级 码龄11年 5粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值