JVM面试重点-2

16. 吞吐量优先和响应时间优先的回收器是哪些?

  • 吞吐量优先:Parallel Scavenge + Parallel Old(多线程并行)->简称: PS+PO -> JDK1.8默认
  • 响应时间优先:ParNew + CMS(并发回收垃圾)

17. GC一定会导致停顿吗,为什么一定要停顿?

GC进行时必须暂停所有Java执行线程,称为Stop The World。

原因:可达性分析过程中不允许对象的引用关系还在变化,否则无法保证可达性分析的准确性。GC只会在“安全点”和“安全区”内开始。

18. Full GC后老年代的空间反而变小?

HotSpot虚拟机的Full GC实现中,默认新生代里所有活的对象都要晋升到老年代,实在晋升不了才会留在新生代。如果Full GC的时候,老年代里的对象几乎没有死掉的,而新生代又要晋升活对象上来,那么Full GC结束后老年代的使用量自然就上升了。

19. 发生Young GC的时候需要扫描老年代的对象吗?

不扫描老年代。

在分代收集中,新生代的规模一般都比老年代要小许多,新生代的收集也比老年代要频繁许多,如果回收新生代时也不得不同时扫描老年代的话,那么Young GC的效率可能下降不少。显然是不可能区扫描老年代的。

大多数垃圾收集器(G1不同),通过CardTable来维护老年代对年轻代的引用,CardTable中标记每个Card的状态,它用BitMap来实现。 如果一个OLD区CardTable中有对象指向Y区,就将它设为Dirty,下次扫描时,只需要扫描DirtyCard。

20. HotSpot虚拟机为什么要分为新生代和老年代?

HotSpot根据对象存活周期将内存分块,它把Java堆分为新生代(Eden)和老年代(Survivor),然后根据各个年代的特点采用合适的收集算法。在新生代中,每次GC时都有大批对象死去,只有少量存活,所以选用复制算法(只需要付出少量存活对象的复制成本就可以完成收集)。在老年代中,对象存活率高、没有额外空间对它进行分配担保,所以使用“标记-清理”或“标记-整理”算法来回收。

21. HotSpot虚拟机GC的分类(准确分为两大种):

Partial GC(分代式收集):并不收集整个GC堆的模式

  • Young GC:只收集young gen的GC
  • Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式
  • Mixed【每克死特】 GC:收集整个young gen以及部分old gen的GC。->只有G1有这个模式

Full GC(全部收集):收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

22. HotSpot 虚拟机GC的触发条件:

Young GC:

Eden区分配满的时候触发,Young GC时,有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。

Full GC之前会进行一次Young GC。

---- ----

CMS 垃圾回收器:配置-XX:+CMSScavengeBeforeRemark,在CMS GC前启动一次young gc,目的在 于减少old gen对ygc gen的引用,降低remark时的开销。

Full GC:

  • 老年代没有足够的空间时,发生Full GC
  • 准备要触发Young GC时,统计要晋升old gen的对象大于目前old gen剩余的空间时,则不会触发Young GC,而是触发Full GC(除了CMS收集器之外,Full GC至少伴随一次Young GC);
  • 如果有永久代的话,在永久代需要分配空间但已经没有足够空间时,也要触发一次Full GC(JDK1.8后,没有永久代);
  • System.gc()默认触发Full GC;
  • heap dump(堆转储文件,是一个Java进程在某个时间点上的内存快照)带GC默认触发Full GC;
  • CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。

23. 安全点与安全区:

OopMap:

  • 概念:记录了栈上本地变量到堆上对象的引用关系。
  • 作用:避免全栈扫描,加快枚举根节点的速度;实现HotSpot JVM的准确式GC。

安全点:

  • 概念:JVM在一些特定的位置记录OopMap信息,这些位置称为“安全点”,运行的程序(获得CUP时间的线程)只有在“安全点”才能GC。
  • 如何让所有线程“跑”到“安全点”?
    • 抢先式中断:不需要线程的执行代码主动配合,GC发生时,中断所有线程,如果发现有线程不再“安全点”上,就恢复线程,让它“跑”到“安全点”上(几乎不用这种方案)。
    • 主动式中断:设置一个标志,每个线程主动轮询这个标志,发现中断标志为真就挂起自己。轮询标志的地方:它与“安全点”重合,然后再加上创建对象分配内存的地方(HotSpot JVM使用)。

安全区:

  • 概念:在一段代码片段中,引用关系不会发生变化,在该区域GC都是安全的,它可以理解成是“安全点”的拓展。
  • 作用:解决没有得到CPU分配时间的线程,无法响应JVM的中断请求,“跑”到“安全点”去挂起的问题。
  • 使用:当用户线程执行到“安全区”里面的代码时,首先标识自己进入了“安全区”,在这段时间里发起GC,就不用管标识自己为“安全区”的线程,在线程离开安全区域时,会检查是否正在执行GC,如果执行GC就等完成后再离开安全区域。

24. Happens-Before规则?(@&@)

作用:

先行发生原则是判断数据是否存在竞争、线程是否安全的主要依据。

口诀:

如果两个操作之间具有happen-before关系,那么前一个操作的结果就会对后面的一个操作可见。是Java内存模型中定义的两个操作之间的偏序关系。

常见规则:

  • 程序顺序规则:
    • 一个线程内,按照程序代码顺序,书写在前面的操作先行发生与书写在后面的操作。
  • 锁规则:
    • 一个unlock操作"先行发生"与后面对同一个锁的lock操作,这里必须指同一个锁,后面指的是时间上的先后顺序。目的是先解锁对其他线程可见。
  • 传递性:
    • 如果A happen-before B,且B happen-before C,那么A happen - before C。
  • volatile变量规则:
    • 对一个volatile变量的写操作"先行发生"于后面对这个变量的读操作,这里的后面同样指时间上的先后顺序。
  • 线程启动规则:
    • Thread对象的start()"先行发生"于此线程的每一个动作。
  • 线程终止规则:
    • 线程中的所有操作都"先行发生"于对此线程的终止检测,我们可以通过thread.join方法结束,thread.isAlive的返回值等手段检测到线程已经终止执行。
  • 线程中断规则:
    • 对线程interrupt方法的调用"先行发生"于被中断线程的代码监测到中断时间的发生,可以通过interrupt方法检测到是否又中断发生

25. 内存屏障的汇编指令是啥?

内存屏障概念:

它是一个CPU的指令,可以保证一些特定操作的执行顺序和影响一些数据的可见性。

硬件内存屏障 X86的指令:

  • sfence(写串行化):在sfence指令前的写操作当必须在sfence指令后的写操作前完成。
  • lfence(读串行化):在lfence指令前的读操作当必须在lfence指令后的读操作前完成。
  • mfence(读写串行化):在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成。
  • 原子指令:
    • 如x86上的”lock …” 指令是一个Full Barrier,执行时会锁住内存子系统来确保执行顺序,甚至跨多个CPU。
    • Software Locks通常使用了内存屏障或原子指令来实现变量可见性和保持程序顺序。

JVM级别如何规范(JSR133):

  • LoadLoad屏障:
    • 对于(这样的语句)Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
  • StoreStore屏障:
    • 对于Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
  • LoadStore屏障:
    • 对于Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
  • StoreLoad屏障:
    • 对于Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。

26. new一个对象的流程:***

  • 首先判断类是否被加载过:JVM收到new指令后,先去静态常量池,寻找这个类的符号引用(全限定名),检查符号引用代表的类是是否已经被加载、解析和初始化过。如果不存在,先执行类加载过程。
  • 根据类信息,先给对象分配内存(包括本类和父类的所有实例变量,不包括上面的静态变量),并设置默认值。
  • 执行初始化代码实例化,先初始化父类再初始化子类,赋予给定值。
  • 如果存在引用对象,还需要将栈对象指向到堆内存中的实际对象。

27. jvm监控系统是通过jmx做的么?(先pass)

JMX:

JMX(Java Management Extensions,即Java管理扩展)在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等。

解答:

一般都是,要是记录比较详细的性能定位指标,都会导致进入safepoint(安全点),从而降低了线上应用性能。

例如 jstack,jmap打印堆栈,打印内存使用情况,都会让jvm进入safepoint,才能获取线程稳定状态从而采集信息。

同时,JMX暴露向外的接口采集信息,例如使用jvisualvm,还会涉及rpc和网络消耗,以及JVM忙时,无法采集到信息从而有指标断点。这些都是基于 JMX 的外部监控很难解决的问题。所以,推荐使用JVM内部采集 JFR,这样即使在JVM很忙时,也能采集到有用的信息。

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

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

相关文章

git 分支管理规范

分支命名 master 分支 master 为主分支,也是用于部署生产环境的分支,需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并,任何时间都不能直接修改代码。 develop 分支 develop 为开发环境分支,始终保持…

VMware 桥接网络突然无法上网

VMware 桥接网络突然无法上网 0. 问题1. 解决方法 0. 问题 昨天,VMware 桥接网络正常使用,今天突然无法上网。 1. 解决方法 打开VMware的虚拟网络编辑器,将桥接模式的网络从“自动”改成你要使用的网卡,问题解决。 完成&#…

通过命令行启动MySQL

通过命令行启动MySQL 右击,选择管理员运行 停止MySQL net stop你的服务名称 net stop MySQL启动MySQL net start你的服务名称 net start MySQL

ElasticSearch地理空间数据了解

ElasticSearch地理空间数据了解 使用场景 Elasticsearch 的地理空间数据处理功能在现代社会中有着广泛的应用,以下是一些常见的使用场景和方向: 1. 位置搜索和导航 本地服务发现:应用程序可以使用 Elasticsearch 查找用户附近的餐馆、商店…

【java分布式计算】分布式计算程序设计基础

期末复习 自留 重点只抓考点 目录 基本技术 SOCKETS网络套接字 多线程 数据序列化 Java I/O流 集合容器 范型 内部类、匿名类、Lambda(代码) 项目构建管理工具 高级技术 注解(代码) 反射(代码)…

C语言笔记第15篇:文件操作

1、为什么使用文件? 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化…

【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object-oriented Programming

💭 写在前面:本章我们将进入 Object-oriented Programming,面向对象编程的讲解,探讨 C 中的类,继承等。 目录 0x00 面向对象编程 0x01 C语言中的结构体 0x02 案例研究:C 中的类 0x03 术语 0x04 继承&…

PHP调用阿里云OSS的SDK封装成服务的完整指南与问题解决

在现代Web开发中,使用云存储来管理和存储大量的静态文件已经成为常态。阿里云OSS(对象存储服务)是其中一个非常受欢迎的选择。在这篇文章中,我们将详细讲解如何在PHP项目中集成并使用阿里云OSS SDK。 #### 一、前期准备 在开始之…

vue3轮播图怎么做

先看效果 实现代码 <n-carouseleffect"card"dot-type"line"draggable:autoplay"!isHovered":current-index"currentIndex"prev-slide-style"transform: translateX(-150%) translateZ(-450px);opacity:1"next-slide-st…

【MySQL】(基础篇十三) —— 联结

联结 本文介绍什么是联结&#xff0c;为什么要使用联结&#xff0c;如何编写使用联结的SELECT语句。介绍如何对被联结的表使用表别名和聚集函数。 SQL最强大的功能之一就是能在数据检索查询的执行中联结&#xff08;join&#xff09;表。联结是利用SQL的SELECT能执行的最重要…

springboot+vue+mybatis教师工作审核系统+PPT+论文+讲解+售后

随着社会不断进步与发展&#xff0c;生活节奏不断加快&#xff0c;信息已经成为我们生活中不可缺少的一部分&#xff0c;很多学校需要掌握大量的信息来了解特定学生的需求&#xff0c;传统的做法是组织大量的人力物力对学生散发调查表&#xff0c;然后对收集的信息进行统计并得…

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介&#xff1a; 本系统结合了图像处理技术和机器学习方法&#xff08;BP神经网络&#xff09;&#xff0c;能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别&#xff0c;系统能够准确地识别各种车牌图像&#xff0c;并在智能交通管理、安防监控等…

LeetCode 338.比特位计数

各位朋友们&#xff0c;大家好啊&#xff0c;今天此题我用的方法比较好理解&#xff0c;但时间复杂度比较高如果大家觉得可以的话&#xff0c;不妨给个免费的赞吧&#xff0c;谢谢了^ _ ^ 1.题目要求如图所示: 2.做题步骤: 1.先计算总共多少个数: int count 0;int number 0;…

25 avl树

目录 底层结构avl树的概念节点定义插入旋转验证删除全性能 1. 底层结构 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有几个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但是二叉搜索树有自…

Android.mk的用法

前言 Android.mk 文件是 Android 编译系统中用于描述项目源文件、库和模块的 Makefile。它采用 GNU Make 的语法,但也包含了一些特定于 Android 编译系统的规则和变量。以下是对其语法和使用方法的详细解释及示例。 一:模块种类 一个Android.mk file用来向编译系统描述你的源…

用Copilot画漫画,Luma AI生成视频:解锁创意新玩法

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;各种创意工具也层出不穷。今天&#xff0c;我们就来介绍一种全新的创作方式&#xff1a;使用Copilot画漫画&#xff0c;再将漫画放入Luma AI生成视频。 Copilot&#xff1a;你的AI绘画助手 Copilot是一款基于人工智…

使用sherpa-ncnn进行中文语音识别(ubuntu22)

获取该开源项目的渠道&#xff0c;是我在b站上&#xff0c;看到了由csukuangfj制作的一套语音识别视频。以下地址均为csukuangfj在视频中提供&#xff0c;感谢分享&#xff01; 新一代Kaldi RISC-V: VisionFive2 上的实时中英文语音识别_哔哩哔哩_bilibili 开源项目地址&…

如何将扫描的 PDF 转换为 Word

您是否正在寻找一种可靠且轻松的方式将扫描的 PDF 文档转换为可编辑的 Word 文件&#xff1f;要将 PDF 转换为可编辑的 Word 文档&#xff0c;神奇之处在于光学字符识别(OCR)。 使用 PDFgear&#xff0c;您可以无缝地将扫描的 PDF 转换为 Word&#xff0c;无论是在线还是离线。…

内网Docker镜像无法使用?Debian/Ubuntu离线安装Dokcer

离线安装Docker 卸载冲突的包 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done先删除docker sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin d…

CLIP-guided Prototype Modulating for Few-shot Action Recognition

标题&#xff1a;基于CLIP引导的原型调制用于少样本动作识别 源文链接&#xff1a;CLIP-guided Prototype Modulating for Few-shot Action Recognition | International Journal of Computer Vision (springer.com)https://link.springer.com/article/10.1007/s11263-023-019…