JVM面试真题总结(九)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

描述CMS垃圾收集的工作过程

CMS(Concurrent Mark Sweep)垃圾收集器的工作过程

主要可以分为以下四个阶段:

初始标记(Initial Mark)

  • 这个阶段的目标是标记所有的 GC Roots 能直接关联到的对象。
  • 这个阶段需要停止所有的用户线程,但是一般情况下,这个阶段会很快完成。

并发标记(Concurrent Mark)

  • 在这个阶段,垃圾收集器会遍历对象图,并标记所有的存活对象,从初始标记的对象开始。
  • 这个阶段是与用户线程并发执行的,不需要停止用户线程。

重新标记(Remark)

  • 因为在并发标记阶段,用户线程还在运行,可能会修改了对象图,所以需要重新标记一次,以确保标记的准确性。
  • 这个阶段需要停止所有的用户线程。

并发清除(Concurrent Sweep)

  • 在这个阶段,垃圾收集器会清除所有未被标记的对象。
  • 这个阶段是与用户线程并发执行的,不需要停止用户线程。

如何防止内存泄漏?

防止内存泄漏主要需要对代码进行精细的管理和控制,以下是一些常用的方法:

及时释放对象:

  • 当对象不再使用时,及时将其引用设置为null,以便让垃圾回收器能够回收。

使用弱引用(WeakReference):

  • 在Java中,使用WeakReference可以在不影响垃圾回收器回收对象的同时,还能使用到这个对象。
  • 当该对象只剩下弱引用时,垃圾回收器会回收它。

避免使用静态变量:

  • 静态变量会在类加载时初始化,并在整个程序运行期间都存在,容易造成内存泄漏。
  • 如果非要使用,应确保在不需要时将其设置为null

及时关闭流、数据库连接等资源:

  • 这些资源都是有限的,使用完后必须及时关闭,否则会造成资源泄漏。

使用finally块:

  • 在Java中,finally块始终会被执行,无论是否有异常发生。
  • 因此,可以在finally块中释放资源。

避免在对象中保存过多的数据:

  • 如果一个对象保存了大量的数据,那么当这个对象被其他对象引用时,会消耗大量的内存。

使用内存分析工具:

  • 内存分析工具(如MAT,VisualVM等)可以帮助你找出内存泄漏的来源,从而更好地修复问题。

对集合类进行适当的管理:

  • 对于集合类,如List,Map等,应该避免让它们过大,并且在不再使用它们时,应该清空或者设置为null

注意线程的使用:

  • 如果线程对象得不到及时的销毁,也会造成内存泄漏。
  • 因此,对于线程对象,我们要特别小心,确保其生命周期得到良好的管理。

简述内存屏障及其类型

内存屏障(Memory Barrier),也被称为内存栅栏,是一种处理器指令

  • 用于防止特定操作的重排序。

它可以确保某些内存操作的顺序性,以及它们对其他处理器可见的顺序。

内存屏障是处理器设计和多线程编程中的重要概念

  • 它是实现诸如volatile,synchronized等高级同步构造的基础。

内存屏障主要有以下四种类型:

LoadLoad屏障:

  • 这种屏障确保了屏障之前的所有Load操作在屏障之后的Load操作之前完成。
    • 即不允许Load操作的重排序。

StoreStore屏障:

  • 这种屏障确保了屏障之前的所有Store操作在屏障之后的Store操作之前完成。
    • 即不允许Store操作的重排序。

LoadStore屏障:

  • 这种屏障确保了屏障之前的所有Load操作在屏障之后的Store操作之前完成。

StoreLoad屏障:

  • 这种屏障确保了屏障之前的所有Store操作在屏障之后的Load操作之前完成。
  • 这是最强的一种内存屏障,也是开销最大的一种。

在Java中,volatile关键字和synchronized关键字的实现就使用了内存屏障。

例如,对volatile变量的写操作会插入StoreStore和StoreLoad屏障

  • 读操作会插入LoadLoad和LoadStore屏障。

而synchronized关键字在锁定和解锁时也会插入相应的内存屏障,以确保操作的顺序性和可见性。

哪些情况会导致栈内存溢出?

栈内存溢出一般发生在递归调用且递归深度过深的场景。

  • 当一个线程请求的栈深度大于JVM所允许的深度,将抛出StackOverflowError异常。

栈内存主要用于存储局部变量和执行动态链接,还用于方法调用和返回。

  • 每次方法调用都会创建一个新的栈帧,这个栈帧会被添加到线程的栈顶。
  • 如果这个方法调用其他方法,那么新的栈帧会继续被添加到栈顶。
    • 当方法调用完成,相应的栈帧会被弹出栈。

每个线程都有一个私有的JVM栈,其大小可以固定也可以动态扩展。

  • 如果固定大小的栈满了,或者动态扩展的栈无法继续扩展,那么JVM就会抛出StackOverflowError

例如,如果你写了一个递归函数,没有提供适当的递归出口,那么这个函数就会无限递归下去

  • 每次递归都会向栈添加一个新的栈帧,最终导致栈内存溢出。
public void recursive() {recursive();
}

以上面的代码为例,这个方法会不断地调用自己,每次调用都会创建一个新的栈帧并压入栈中

  • 但是没有任何方法可以弹出栈帧,因此最终会导致栈内存溢出。

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

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

相关文章

牛客练习赛(下)

Cidoai的平均数对 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> #include <vector> using namespace std; int main() {int n, k;cin >> n >> k;int totalAns 0;int rSum 0;vector<int> ex, weights;for (i…

情感AI:科技赋能情感计算的新时代

一、引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;情感AI&#xff08;Affective AI&#xff09;成为了人工智能领域中的一大热门话题。情感AI&#xff0c;或称情感计算&#xff08;Affective Computing&#xff09;&#xff0c;指的是通过计算机技术…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

Redis——常用数据类型hash

目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值&#xff1a;设置成功的键值对的个数hget HGET key field//hdel HDEL key…

统计/nginx/access.log中每个日志的访问次数,按高到低排列

/nginx/access.log具体内容长这样&#xff1a; 第一个元素就是ip。 awk {print $1} /nginx/access.log | sort | uniq -c | sort -r首先&#xff0c;awk {print $1} /nginx/access.log 从 /nginx/access.log文件的每行中提取出第一个字段。然后&#xff0c;sort 对提取出的第…

【linux-Day3】linux下的基本指令

【linux-Day3】linux下的基本指令 linux下的基本指令&#x1f4e2;man&#xff1a;访问linux手册页&#x1f4e2;echo&#xff1a;把字符串写入指定文件中&#x1f4e2;cat&#xff1a;查看目标文件的内容&#x1f4e2;cp&#xff1a;复制文件或目录&#x1f4e2;mv&#xff1a…

移动剧院:便携与声学结合的创新空间—轻空间

随着现代文化和娱乐需求的多样化&#xff0c;传统剧院形式已经无法完全满足人们的需求。作为创新型建筑解决方案的代表&#xff0c;移动剧院凭借其独特的便携性和卓越的声学效果&#xff0c;成为了各类文化活动、音乐会、戏剧表演等活动的理想场所。 高效搭建&#xff0c;便捷移…

开源链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序:重塑私域微商新生态

摘要&#xff1a;本文深入探讨在私域环境下&#xff0c;微商借助微信平台获客成本近乎白菜价的现象。分析微信发展带来的市场蓝海以及微商作为开荒者的机遇与挑战。引入开源链动 21 模式、AI 智能名片和 S2B2C 商城小程序&#xff0c;阐述其如何为微商带来新的发展机遇&#xf…

SQL server 6.5升级到SQL server 2019的方法

背景&#xff1a; 对日项目&#xff0c;客户的旧系统的数据库用的是SQL server 6.5&#xff0c;操作系统是windows NT。新系统要求升级到SQL server 2019&#xff0c;查了下资料发现旧系统的版本实在是太久远了&#xff0c;90年代的。 数据库部分的升级思路是这样的&#xff…

55页可编辑PPT | 集团制造企业数字化转型顶层设计方案

这份PPT文档是一份关于集团制造企业数字化转型的顶层业务设计方案。文档详细介绍了企业在后ERP时代面临的挑战&#xff0c;以及如何通过Oracle解决方案来实现数字化转型。 数字化转型的三大要点集中在满足利益相关者的期望&#xff0c;以企业价值为核心引领业务模式的创新&…

SpringBoot整合JDBCTemplate(day34)

1 学习目标 了解JDBCTemplate重点掌握JDBCTemplate常用方法重点掌握SpringBoot项目整个JDBCTemplate重点掌握JDBCTemplate的CRUD操作 2 JDBCTemplate介绍 JDBCTemplate是Spring官方提供的&#xff0c;基于jdbc技术访问数据库的一个API对象。此对象基于模板方法模式&#xff…

无人机应用新纪元:图形工作站配置推荐与硬件解析

低空经济作为国家新兴的战略性产业&#xff0c;正逐步成为经济高质量发展的新动力。据统计&#xff0c;2023年中国低空经济规模达到5059.5亿元&#xff0c;增速为33.8%&#xff0c;预计到2026年有望突破万亿元大关。政府对低空经济的发展高度重视&#xff0c;不仅出台了相关法规…

机器学习特征构建与特征筛选

前言 上一篇文章讲述了原始特征分析和处理&#xff0c;保障后续拿到的是干净的特征变量&#xff0c;但实际这些特征对于建模不一定是有效的&#xff0c;所以需要在原始特征的基础上&#xff0c;结合业务场景做特征变量的衍生&#xff0c;提升数据的表达能力。此外&#xff0c;…

【devops】devops-git之git分支与标签使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

RNN基本介绍

RNN输入和输出不是向量的时候&#xff0c;需要进行向量化。

中国书法—孙溟㠭浅析碑帖《石门颂》

中国书法——孙溟㠭浅析碑帖《石门颂》 《石门颂》是东汉时期的摩崖刻石&#xff0c;属隶属体&#xff0c;全称是《故司隶校尉犍为杨君颂》&#xff0c;建和二年《公元148年》摹刻&#xff0c;记载的内容是杨孟文主持修复褒斜栈道的事迹&#xff0c;因为刻在陕西褒城北石门崖壁…

如何建立一个Webservice WSDL的简单例子(完整例子)

一:根据对方给的wsdl 的接口地址创建Web 的逻辑端口 1:例如这个用C#写的Web 2.我们需要在SAP里建立一个Service Consumers 的服务记得后缀要加?wsdl 2:然后就会生成对应方法的出参 入参 返回的消息根据接口方法来判断 二:如何通过LPCONFIG建立逻辑端口或者通过SOAMANAGER…

系统架构设计师 - 项目管理

项目管理 项目管理&#xff08;1-3分&#xff0c;案例分析 25分&#xff09;立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…

actuator字符绕过漏洞在Nginx上的配置

最近遇到了安全部门派发的actuator泄漏漏洞&#xff0c;领导希望不暴露到外网上&#xff0c;对于内网需要认证才可以访问。 要想不暴露到外网上&#xff0c;就需要在网络层面做拦截&#xff0c;比如nginx和apisix上做代理配置。 URI字符绕过的风险背景知识: URI字符绕过是一种安…