JVM(面试问题简析)学习笔记

news2025/1/23 22:42:20

文章目录

  • 1. JVM中有哪几块内存区域?Java 8 之后对内存分代做了什么改进?
  • 2. 你知道JVM是如何运行起来的吗?堆内存中对象的分配的基本策略?
  • 3. 说说 JVM 在哪些情况下会触发垃圾回收?JVM 的年轻代垃圾回收算法?
  • 4. 说说对象什么时候转移到老年代,以及老年代垃圾回收算法
  • 5. 常用的垃圾回收器有什么?
  • 6. 生产环境中的 Tomcat 是如何设置 JVM 参数的?如何检测 JVM 运行情况?
  • 7. 发生 OOM 之后,应该如何排查和处理线上系统的 OOM 问题?

1. JVM中有哪几块内存区域?Java 8 之后对内存分代做了什么改进?

  • Java 8 之前:
    在这里插入图片描述

    • 上图是 JVM 中最基本的、也是最常用的三个内存区域
    • 程序运行后,常量池和所有类信息都会加载到永久代内,Spring 实例化的所有对象都会加载到堆内存中,当执行请求时需要由线程进行执行所以栈内存就是线程独有的内存
  • Java 8 以后的内存分代进行的改进:

    • 常量池放入堆内存中
    • 类信息放入到元空间中

2. 你知道JVM是如何运行起来的吗?堆内存中对象的分配的基本策略?

  • 如果一个类中包含了一个 main 方法,当执行 main 方法时,会启动一个 JVM 的进程,它会默认一个 main 线程,这个main 线程就会负责执行一个 main 方法的方法,进而创建各种对象,实现逻辑
  • 如果把代码放到 tomcat 中,所有的类都会被类加载器加载到元空间中,Spring 容器启动后会扫描对应的代码,会通过反射技术,创建出类的 Bean 实例,并加载到堆内存中。
  • 当有请求进入 Tomcat 时,都会分配一个线程去处理它, 每一个线程都会分配一个栈内存。在处理请求时可能会使用到 Bean 实例中的方法,执行方法时会在栈内存中会创建一个栈帧,并且把该方法中的局部变量存在栈帧中。当需要使用到局部的对象的时候会在堆内存中创建对象实例,接着栈帧中的局部变量会去引用堆内存中的对象实例。在执行当前方法的过程中引用到其他方法,则会将该方法压入栈顶。当方法执行完毕后会依次出栈,并将局部变量销毁
    在这里插入图片描述

3. 说说 JVM 在哪些情况下会触发垃圾回收?JVM 的年轻代垃圾回收算法?

  • 堆内存中的内存分代
    在这里插入图片描述

    • eden、s0,s1 都属于新生代
    • tentired 属于老年代
    • 新生代中内存分配规则一般为 8:1:1
  • 如果eden区满了,就会触发年轻代的GC

  • 在执行年轻代GC的时候,会将没有任何引用的对象回收,一般情况下被方法的局部变量、类的静态变量引用的对象不会被回收,其他都会被回收

  • 一般,再垃圾回收处理时,一边判断哪些没有被引用,一边进行回收是不现实的,所以有一个 stop the world 的概念,也就是在垃圾回收时,会停止工作线程运行,然后再判断哪些可以回收

  • 年轻代垃圾回收的算法

    • 复制算法
    • 当 eden 区满了之后,会将 eden 区中还有被引用的对象,复制到 s0 区,然后将 eden 区整个清空
    • 当 eden 区再一次满了之后,会将 eden + s0 区中还有被引用的对象复制到 s1 区域,然后将 eden + s0 区域整个清空
    • 在下一次就是,将 eden + s1 区域还有被引用的对象复制到 s0,将 eden + s1 区域整个清空
      以此往复……

4. 说说对象什么时候转移到老年代,以及老年代垃圾回收算法

  • 以下三种情况会转移到老年代

    1. 在 s0、s1 来回复制很多次(一般15次)的对象,也即熬过很多次垃圾回收,长期存活的对象
    2. 很大的对象
    3. 回收时所有存活的对象比 s 区域内存还要大,不能直接存入 s 区域的对象
  • 对于老年代而言,其中的垃圾对象不是很多,大部分都是需要长期存活的对象

  • 老年代的垃圾回收比年轻代的速度会慢 10 倍以上

  • 所以老年代的垃圾回收算法主要为:

    • 标记-清理
      • 标记出没有被引用的垃圾对象,直接清理掉
      • 这种方式会引发内存碎片的问题
    • 标记-整理
      • 将老年代中存活的对象标记出来,并将它们压缩整理到一块连续的内存空间内,这样剩余的可用空间也就是连续的
      • 这样就可以解决上面方法产生的问题

5. 常用的垃圾回收器有什么?

  • 比较常用的为以下三种
  1. parnew + cms 的组合

    • 在 JDK 8 及 8 以前较为常用
    • parnew 是针对年轻代,和上文的算法大致相同,只不过是使用多线程进行回收
    • cms 是针对老年代,它会将老年代的回收分为好几个阶段:初始标记、并发标记、并发清理……
    • 使用这种方法进行垃圾回收,尽可能的让垃圾回收和工作线程并发进行,尽量减少 stop the world 的时长
  2. g1 直接分代回收

    • JDK 9 及以后主推
    • 年轻代、老年代都适用

6. 生产环境中的 Tomcat 是如何设置 JVM 参数的?如何检测 JVM 运行情况?

  • 如果通过预估+压测,做一份生产环境的 JVM 参数出来,如何区观察 JVM 运行的情况

7. 发生 OOM 之后,应该如何排查和处理线上系统的 OOM 问题?

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

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

相关文章

【杂凑算法篇】密码杂凑算法的安全强度

【杂凑算法篇】密码杂凑算法的安全强度 杂凑(哈希)算法安全强度—【蘇小沐】 文章目录 【杂凑算法篇】密码杂凑算法的安全强度(一)安全强度(Security Strength)(二)杂凑算法的安全强度与对比总…

x86汇编

寄存器 常规 AX累加,算术运算或函数返回值存储 基址寄存器(BX),指向数据的指针 计数寄存器CX,移位,循环,一些量 数据寄存器DX,运算超过16位,高16位放在DX 堆栈指针寄存器SP,用于指向…

系统设计访谈-业内人事指南 《System Design Interview-An insider‘s guide》中文版

前言: We are delighted that you have decided to join us in learning the system design interviews. System design interview questions are the most difficult to tackle among all the technical interviews. The questions require the interviewees to de…

(Qt) 重定向内置日志

文章目录 前言代码.pri 独立的包log.priLOG_Config.hppLOG.hLOG.cpp examplelog_test.promain.cpp 使用效果debug模式release模式 分析Qt内部结构核心函数核心配置 END 前言 在软件开发过程中&#xff0c;避免不了日志的使用。 在Qt中&#xff0c;我们平常用的#include <Q…

Django | 解决admin增加新用户只有用户名密码和确认密码的问题

文章目录 如图所示&#xff0c;下面给出解决方案&#xff1a; 如果您使用 使用 Django 默认的后台管理界面添加用户时&#xff0c;只看到了三个字段&#xff08;通常是 username、password和 repassword&#xff09;&#xff0c;那么可以通过定义 add_fieldsets 属性来增加更多…

Jenkins关联GitLab

1、Jenkins、GitLab服务器上面生成公钥、私钥 ssh-keygen -t ecdsa # 回车 指到没有交互式2、GitLab WEB端添加 刚刚生成的公钥 cat ~/.ssh/id_ecdsa.pub # 查看密钥登入gitlab > 右上角头像 > 偏好设置 > SSH秘钥 使用相同方法 添加Jenkins秘钥 3、Jenkins创建一…

Graph push pull

图数据的存储结构 键值对存储因具有可扩展强、结构简单、查找迅速等特点被广泛应用于图查询系统中&#xff0c;如Wukong、Trinity.RDF。在Wukong系统中&#xff0c;图上的边会转换成键值对进行存储&#xff0c;将顶点编号、边的类型、边的方向、值的地址和大小等信息组合成键&…

Bitmap 实现当前在线用户数量

Bitmap是什么&#xff1f; Bitmap是Redis中的一种数据结构&#xff0c;它是一个类似于位数组的数据结构&#xff0c;用于处理位数据。在Redis中&#xff0c;Bitmap是使用字符串来存储的&#xff0c;一个Byte可以存储8个二进制位&#xff0c;一个字符串可以存储232个二进制位&a…

成功解决:NLTK包的安装错误

成功解决NLTK包的安装错误 创建环境NLP_Pre_train l环境 conda create -n NLP_Pre_train python3.8激活 conda activate NLP_Pre_train安装NLTK&#xff0c;套用以下命令 pip install NLTK之后是验证NLTK是否安装成功&#xff0c;采用的步骤如下所示&#xff1a; import n…

认识Java文件操作和IO流

文件操作&#xff08;一&#xff09; 文章目录 文件操作&#xff08;一&#xff09;文件的特性路径文件分类File类的使用文件的创建文件的删除文件创建加目录创建列出当前文件夹包含的文件文件重命名函数 文件的特性 我们所说的文件一般指的是硬盘文件&#xff0c;其实文件不止…

Minio对象存储服务介绍、单机和集群部署及其使用

Minio对象存储服务介绍、单机和集群部署及其使用 前言Minio简介Minio版本选择AGPL协议说明Minio优缺点优点缺点 Minio分server 和clientminio-client下载二进制文件查看 mc 版本 Minio分布式集群详细搭建基础环境操作系统Minio下载 准备工作1、机器资源2、创建相关目录3、创建启…

IOC容器与DI依赖注入示例

IOC容器与DI依赖注入示例 IOC深入理解IOC示例&#xff1a; DI深入理解DI示例 IOC深入理解 我们先通过几个问题来加深一下对IOC的理解 (1)Spring是使用IOC容器来管理bean对象的&#xff0c;我们主要管理什么? 主要管理项目中所使用到的类对象&#xff0c;比如(Service层对像和…

哈希表|STL使用

哈希表 时间复杂度为O(1) 拉链法 把X代表的数字映射到N所在区间&#xff0c;有可能会发生冲突俩个或多个数字映射到1个数 拉链法&#xff1a;把冲突的数字挂起来&#xff0c;用单链表挂起来 一般取模的数要取成质数&#xff0c;而且这个质数离二的n次幂要比较远&#xff0c;这样…

什么是深度学习?

目录 简介 深度学习的由来 深度学习未来的趋势 总结 简介 深度学习是在20世纪80年代被提出来的&#xff0c;主要是由加拿大的计算机科学家Geoffrey Hinton、Yoshua Bengio、Yann LeCun等人发起的。Geoffrey Hinton等人在经过多年的研究和实践之后&#xff0c;…

C语言的指针(进阶)

目录 数组指针 数组指针的使用 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 数组指针 数组指针是指针&#xff1f;还是数组&#xff1f; 答案是&#xff1a;指针 数组指针也就是指向一个数组的指针 看下面两条代码&#xff1a; int *p1[10]; int (*p2)[10]; …

Manjaro安装clash-for-windows-bin

安装 安装Clash for Windows yay -S clash-for-windows-bin 配置 命令行进入~/.config/clash/ &#xff0c;配置文件 config.yaml 和 Country.mmdb wget -O config.yaml [订阅链接]wget -O Country.mmdb https://gitee.com/mirrors/Pingtunnel/raw/master/GeoLite2-Country.…

领导给了一千多个需求,这个排序法救了我的命……

什么是MoSCoW排序法&#xff1f; 莫斯科排序法是一种优先级排序法&#xff0c;用于管理需求、任务或功能列表。该方法可以帮助团队确定哪些需求、任务或功能是最重要的&#xff0c;并决定在特定时间段内是否需要完成它们。 所以在对需求进行排序时&#xff0c;可以从以下维度…

优思学院|六西格玛常见问题有哪些?

要实现高质量、高效率和高客户满意度的目标&#xff0c;许多企业采用了六西格玛方法。然而&#xff0c;在实施过程中&#xff0c;往往会遇到各种各样的问题。优思学院会在这里探讨一下几个六西格玛常见问题&#xff0c;并提供解决方案&#xff0c;以帮助企业成功实施六西格玛方…

JSONP数据劫持漏洞

​介绍 JSONP&#xff08;JSON with Padding&#xff09;是 json 的一种"使用模式"&#xff0c;可以让网页从别的域名&#xff08;网站&#xff09;那获取资料&#xff0c;即跨域读取数据&#xff1b;它利用的是script标签的 src 属性不受同源策略影响的特性&#x…

GoNote第二章 Moudles

Go Modules 1. 介绍 Go modules是官方提供的go包管理工具&#xff0c;用于解决go包管理和依赖问题&#xff1b;从1.11开始引入&#xff0c;到现在1.14已经比较完善&#xff0c;1.16已经全面推荐使用&#xff0c;并且默认为开启&#xff1b;Go Modules类似于JS的NPM&#xff0…