【JAVA面试】JVM

news2024/11/15 11:21:01

提示:文章先作为初版,等后续时间充足后,补充更深的内容

文章目录

  • JVM
  • 一、垃圾回收算法
  • 二、什么是STW
  • 三、JVM参数
  • 四、JVM内存模型


JVM

一、垃圾回收算法

JVM中的垃圾回收算法可以分为两种类型:基于引用计数的垃圾回收算法和基于可达性分析的垃圾回收算法。目前主流的JVM垃圾回收算法都是基于可达性分析的。

引用计数算法
引用计数算法是一种简单的垃圾回收算法,它的原理是通过计数来判断对象是否为垃圾对象。每个对象都有一个引用计数器,当有一个指针指向该对象时,引用计数器就会加1,当指针失效时,引用计数器就会减1。当引用计数器的值为0时,就可以判定该对象为垃圾对象。然而,这种算法有一个明显的问题,就是无法解决循环引用的问题,即两个对象互相引用的情况

可达性分析算法
可达性分析算法是现代JVM垃圾回收算法的主流算法,它的基本思路是通过一系列称为“GC Roots”的根对象作为起点,从这些对象开始遍历整个对象图,能够到达的对象就是存活对象,不能到达的对象就是垃圾对象。根对象包括虚拟机栈中的引用对象、方法区中类静态属性引用的对象和常量引用的对象等。

可达性分析算法具有以下特点:

它可以有效地解决循环引用的问题。
它可以通过多种不同的算法实现,例如标记-清除算法、复制算法、标记-整理算法和分代算法等。
它需要暂停应用程序的执行,以便进行垃圾回收,因此可能会对程序的性能产生一定的影响。

常见的垃圾回收算法包括:

标记-清除算法:该算法分为标记和清除两个阶段,首先标记出所有存活对象,然后清除所有未标记的对象。这种算法比较简单,但是有个很严重的问题,会产生大量的内存碎片
复制算法:为了解决标记清除算法的内存碎片问题。该算法将内存分为两个区域,每次只使用其中一个区域,当一个区域满了之后,将其中所有存活对象复制到另一个区域,然后清空原来的区域。他的问题就在于浪费空间。而且,他的效率跟存活对象的个数有关。
标记压缩算法:为了解决复制算法的缺陷,就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是一样的,但是在完成标记之后,不是直接清理垃圾内存,而是将存活对象往一端移动,然后将边界以外的所有内存直接清除
标记-整理算法:标记-整理算法也是为了解决内存碎片问题。与标记-压缩算法不同的是,标记-整理算法在标记阶段后,会将所有存活对象移动到一端,然后直接清理边界以外的所有内存。移动对象的操作会产生内存的空洞,但是清理完毕之后,会将所有存活对象压缩到一起,使内存空间得到了整理。该算法将存活对象压缩到内存的一端,然后清除另一端的所有未被占用的内存空间。
分代算法:分代收集算法的核心思想是将堆内存分为不同的代,一般将新生代划分为 Eden 区、Survivor 区,老年代就是指存活时间较长的对象。新生代的对象由于生命周期短,所以采用复制算法老年代的对象则采用标记-整理或者标记-清除算法。

二、什么是STW

STW指的是Stop-The-World,即全局停顿。在Java应用程序运行的过程中,JVM需要对内存进行垃圾回收、线程栈整理、内存整理等操作,这些操作都需要暂停Java应用程序的执行,这就是STW。在STW期间,JVM会暂停所有线程的执行,包括用户线程和垃圾回收线程,直到垃圾回收等操作完成后才会继续执行。(只有在进行 **Full GC(全局垃圾回收)**时,JVM 才会暂停所有线程的执行,包括用户线程和垃圾回收线程,直到垃圾回收等操作完成后才会继续执行。这种情况下的停顿时间会比较长,可能会影响应用程序的性能和响应时间。而对于局部垃圾回收(如 Minor GC),JVM 只会暂停用户线程的执行,等待垃圾回收线程完成操作后再继续执行用户线程。这种情况下的停顿时间相对较短,不会对应用程序的性能和响应时间产生明显的影响。)

STW是为了保证垃圾回收的正确性而采取的一种措施。在垃圾回收期间,如果不停顿Java应用程序的执行,那么就有可能会产生一些问题,比如对象的引用关系会发生变化,而正在执行的线程可能会访问到不一致的对象状态,导致应用程序出现不可预知的错误。因此,在进行垃圾回收等操作时,必须要停顿Java应用程序的执行,以保证数据的一致性

STW时间的长短和频率对Java应用程序的性能影响很大,因此,JVM一直在不断优化垃圾回收算法和机制,以减少STW的时间和频率

三、JVM参数

JVM参数分为标准参数和非标准参数两类。标准参数是指在所有JVM实现中都必须支持的参数,非标准参数是指在某些JVM实现中才会支持的参数。

标准参数包括:
-classpath或-cp:指定类路径,多个路径之间用冒号或分号分隔(Linux或Windows环境下分别使用不同的分隔符)。
-version:输出当前JVM的版本信息。
-help:输出JVM的命令行帮助信息。
-Xms:指定JVM堆的初始大小。
-Xmx:指定JVM堆的最大大小。
-Xss:指定每个线程的栈空间大小。
-Xmn:指定新生代的大小。
-XX:+UseParallelGC:指定使用并行垃圾回收器。
-XX:+UseConcMarkSweepGC:指定使用CMS垃圾回收器。
-XX:+UseG1GC:指定使用G1垃圾回收器。

非标准参数包括:
-XX:+HeapDumpOnOutOfMemoryError:在内存溢出时自动生成堆转储快照。
-XX:MaxPermSize:指定永久代的最大大小(JDK 8及以上不支持)。
-XX:MaxMetaspaceSize:指定元空间的最大大小(JDK 8及以上使用)。
-XX:PrintGCDetails:打印GC详细信息。
-XX:SurvivorRatio:指定新生代中Eden区和Survivor区的比例。
-XX:PermSize:指定永久代的初始大小(JDK 8及以上不支持)。
-XX:MetaspaceSize:指定元空间的初始大小(JDK 8及以上使用)。

四、JVM内存模型

在这里插入图片描述
JVM内存模型指的是Java虚拟机运行时使用的内存模型,它将内存分为不同的区域,每个区域有不同的作用和生命周期。这些区域包括:

程序计数器(Program Counter Register):线程私有,记录当前线程执行的字节码行号,用于支持线程切换和异常处理。

虚拟机栈(Java Virtual Machine Stacks):线程私有,每个方法在执行时会创建一个栈帧,用于保存方法的局部变量、操作数栈、动态链接、方法出口等信息。栈帧随着方法的执行压入和弹出虚拟机栈,如果虚拟机栈的空间不足,会抛出StackOverflowError,如果虚拟机栈可以动态扩展但无法申请到足够的内存空间,会抛出OutOfMemoryError。

本地方法栈(Native Method Stack):和虚拟机栈的作用相似,只不过是为本地方法服务的。

堆(Heap)线程共享,用于存储Java对象实例。Java虚拟机启动时会分配一块固定大小的堆空间,可以通过设置-Xmx和-Xms来调整堆的大小。如果堆中没有足够的空间分配新的对象,会触发垃圾回收,如果垃圾回收后仍然无法获得足够的空间,会抛出OutOfMemoryError。

方法区(Method Area)线程共享用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区也被称为永久代(Permanent Generation),在JDK8及以后的版本中,被移除并被称为元空间(Metaspace)。

运行时常量池(Runtime Constant Pool):方法区的一部分,用于存储编译时生成的各种字面量和符号引用。每个类或接口都有一个运行时常量池,用于支持类或接口的运行。

直接内存(Direct Memory):JVM管理的堆外内存,通过DirectByteBuffer来进行操作,也被称为NIO堆外内存。由于堆外内存不受JVM内存限制的控制,因此可能导致系统内存的不足。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考…

【Unity3D】Shader变体管理流程-变体剔除

一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如说,这个是否支持阴影,此时就需要加keyword(…

强化学习p1-基本概念

Terminologies(名词) 状态(State) 每个时刻,环境有一个状态 (state),可以理解为对当前时刻环境的概括 状态(State) 有时也被称为观测(Observation),因为有时智能体并不能观测到环境改变后的全部,只能观测到部分。 环境(Environm…

计算机毕业论文内容参考|软件工程|网络流量异常信息分析方法研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 网络流量异常信息分析方法研究 文章重点 摘要 本课题针对网络安全中网络流量异常的分析方法进行研究,提出一种基于机器学习和深度学习的异常检…

OpenCV教程——处理图像像素及图像掩膜

1.像素值 像素值是图像被数字化时由计算机赋予的值,代表了图像中某一小方块(即【像素点】)的平均亮度信息。 灰度图像通常用8位表示一个像素,这样总共有256个灰度等级(像素值在0~255之间)。 …

最值得推荐的免费分区管理软件

磁盘管理是 Windows 的内置工具,用于操作硬盘上的分区,但自 Windows XP 以来直到Windowa11 该程序几乎没有变化。个人测试了五个备选方案,以了解它们之间的比较。 奇客分区 默认的分区个数根据磁盘大小?需要重新划分分区&#xf…

2023/5/8总结

JAVA基础知识(2) 1.方法 1、方法定义 格式:public static void 方法名(){ //方法体 } 2、方法调用 格式:方法名(); 3、方法的通用格式 public static 返回值类型方法名&…

Camtasia2023官方中文版免费下载

在现在的网络互联网时代,越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频,也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音,做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

【机组组合】基于数据驱动的模型预测控制电力系统机组组合优化【IEEE24节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL ---- 事务

事务 1、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撒销操作请求,即这些操作要么同时成功,要么同时失败。 在实际的开发过程中,一个业务操作如&am…

如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)

如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows) 如何制作 ESXi USB 启动盘 请访问原文链接:https://sysin.org/blog/create-bootable-esxi-usb-installer/,查看最新版。原创作品,转载请保留出处。 作者主页:sysi…

第四十六章 Unity 布局(上)

学习了UI元素的使用,并不能构建出一个完整的UI界面,我们需要使用一些方法将这些UI元素按照“设计稿”的效果,将其摆放到对应的位置上。如何摆放这些UI元素,就是我们需要讲的“布局”,当然这需要借助一些布局组件来完成…

SpringBootFoundation

SpringBootFoundation 一. 项目创建1.1 创建项目1.2 并调整pom.xml1.3 创建子项目1.4 配置子项目pom1.4.1 使用`csmall-server`作为父项目 并且 添加依赖项1.5 关于聚合项目二. YAML语法的配置2.1 关于YAML语法一. 项目创建 1.1 创建项目 本项目是一个聚合项目的结构,首先,创…

clickhouse集群部署指南

一、前言: 上篇文章介绍了clickhouse单机部署指南,本章重点介绍下集群部署指南,文章重在实战,相关知识请自行学习。 二、环境准备: CentOS7 4核16G 3台(172.25.16.82、172.25.16.83、172.25.16.84) 三、安装包准备…

第三方ipad笔哪个牌子好用?ipad触控笔推荐平价

至于选择苹果原装的电容笔,还是平替的电容笔,要看个人的需求而定,比如画图用的,可以用Apple Pencil;比如学习记笔记用的,可以用平替电容笔,目前的平替电容笔无论是品质还是性能,都非…

【Linux】Linux环境下安装Jenkins(图文解说详细版)

文章目录 前言1、在根目录下创建文件夹2、下载linux jenkins3、 进入jenkins目录解压,解压命令:4、启动5、访问一下,浏览器访问:http://服务器IP:8080/ 前言 首先安装Jenkins之前,linux中必须安装好了JDK和Maven,如果…

MVI架构理解

回顾MVC MVP MVVM MVC MVC架构主要分为以下几部分: View层: 对应于xm布局文件和java代码动态view部分。 Controller层: 主要负责业务逻辑,在android中由Activity承担,但xml视图能力太弱,所以Activity既要负责视图的显示又要加入…

Node框架 【Koa】之 【静态资源管理、模板引擎、连接数据库】

文章目录 🌟前言🌟静态资源托管🌟安装🌟使用 🌟Koa视图🌟EJS模板引擎使用🌟安装🌟配置🌟使用🌟模板渲染方法🌟使用案例 🌟数据库&…

OBS直播时编码器、码率控制器、分辨率帧率是什么以及如何向第三方推流

内容摘要:OBS直播时编码器、码率控制器、分辨率、帧率到底是什么,以及OBS向第三方直播平推流时,要注意什么。 图:OBS直播时输出界面参数设定 OBS编码器 1. 软编:x264 使用CPU进行编码,占用CPU资源多&…

m3u8文件

#EXTM3U:m3u文件头,必须放在第一行,起标示作用; #EXT-X-VERSION:播放列表文件的兼容版本。若不存在此标记,则默认为协议的第一个版本; #EXT-X-MEDIA-SEQUENCE: 播放列表中的每个媒…