JVM面试篇(下)

垃圾收集器

简述 Java 垃圾回收机制


在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。


GC 是什么?为什么要 GC


  1. GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存。

  2. 回收会导致程序或系统的不稳定甚至崩溃 Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动。

  3. 回收内存的目的, Java语言没有提供释放已分配内存的显示操作方法。


垃圾回收的优点和原理。2 种回收机制


Java 语言最显著的特点就是引入了垃圾回收机制,它使 Java 程序员在编写程序时不再考虑内存管理的问题。

由于有这个垃圾回收机制, Java 中的对象不再有“作用域”的概念,只有引用的对象才有“作

用域”。


  1. 垃圾回收机制有效的防止了内存泄露,可以有效的使用可使用的内存。
  2. 垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。

程序员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。垃圾回收有分代复制 垃圾回收标记垃圾回收、增量垃圾回收


垃圾回收器的基本原理是什么?


对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。


主动通知虚拟机进行垃圾回收的办法?


通常,GC 采用有向图的方式记录管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当 GC 确定一些对象为" 不可达"时,GC 就有责任回收这些内存间。


垃圾回收器可以马上回收内存吗?


可以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。


我们能保证 GC 执行吗?


不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证GC 的执行。


Java 中引用类型有哪些?


  • 强引用:发生 gc 的时候不会被回收。
  • 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
  • 弱引用:有用但不是必须的对象,在下一次 GC 时会被回收。
  • 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。

强引用、软引用、弱引用、虚引用的区别?


思路: 先说一下四种引用的定义,可以结合代码讲一下,也可以扩展谈到ThreadLocalMap 里弱引用用处。

  • 强引用

    我们平时 new 了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足

    的情况下,JVM 宁愿抛出 OutOfMemory 错误也不会回收这种对象

  • 软引用

    如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

      SoftReference<String> softRef=new SoftReference<String>(str); // 软引用
    
    • 用处:软引用在实际中有重要的应用,例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

      1. 如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建
      2. 如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出.

      如下代码


Browser prev = new Browser(); // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用 
if(sr.get()!=null){rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
}else{prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了sr = new SoftReference(prev); // 重新构建
}

  • 弱引用

    具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

      String str=new String("abc"); WeakReference<String> abcWeakRef = newWeakReference<String>(str);str=null;等价于str = null;System.gc();
    
  • 虚引用

    如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。

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

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

相关文章

Python | 判断集合成员(set作为哈希表)(集合)

set的概念和特点set的基本操作&#xff0c;比如创建、插入、删除、查找set的常用方法 集合&#xff1a; 也是一种数据结构&#xff0c;和数学中的集合类似&#xff0c;它用 于存储一组不重复的元素&#xff0c;并且不保证元素的顺序。查找通常是集合最重要的操作。 1.可以使用…

筛斗数据:数据治理在企业发展中的关键作用

随着信息技术的飞速发展&#xff0c;数据已成为企业最宝贵的资产之一。在这样的背景下&#xff0c;数据治理作为确保数据质量、可用性、一致性和安全性的过程&#xff0c;其重要性日益凸显。本文将探讨数据治理与企业之间的紧密联系&#xff0c;以及如何通过有效的数据治理策略…

centos安装部署Mysql8详细教程

文章目录 一、下载安装1.下载2.安装 二、常见问题1.You must reset your password using ALTER USER statement before executing this statement2.IP is not allowed to connect to this mysql 结尾 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、…

JL-8B/1111电流继电器 带板前接线附件 约瑟JOSEF

JL-8系列继电器型号&#xff1a; 电流继电器JL-8GB/11 电流继电器JL-8GA/21 过电流继电器JL-8GB/1 电流继电器JL-8B/521DK 电流继电器JL-8B/222DK 电流继电器JL-8B/1121 电流继电器JL-8B/12 电流继电器JL-8B/3211 电流继电器JL-8B/E2 电流继电器JL-8B/E3 过电流继电器JL-…

Python项目实战 - 简易计算器

Python项目实战 - 简易计算器 引言 在Python编程学习中&#xff0c;项目实战是巩固知识、提升技能的重要途径。本次我们将通过构建一个简易的计算器项目来锻炼Python的基础知识&#xff0c;包括变量、函数、条件语句和输入/输出操作。通过这个项目&#xff0c;你将能够深入理…

YOLOv8改进有效涨点专栏目录——包含backbone、head、neck和损失函数上百余种改进技巧

专栏地址&#xff1a;YOLOv8改进有效涨点——持续更新中 backbone——主干 YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 完整代码】 YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】 YOLOv8改进 | 主干网络 | 在…

大宋咨询(深圳神秘顾客)关于连锁药店神秘顾客检查的内容

药店作为社会公共卫生体系的重要组成部分&#xff0c;其服务质量和药品管理水平直接关系到公众的健康与安全。为了提升药店的服务质量&#xff0c;确保药品的合规销售&#xff0c;神秘顾客调查作为一种有效的评估手段&#xff0c;逐渐在药店行业中得到广泛应用。大宋咨询&#…

基于三元组一致性学习的单目内窥镜里程计估计

文章目录 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope摘要方法实验结果 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope 摘要 单目图像中深度和姿态的估计对于计算机辅助导航至关重要。由于很难获…

Kafka消费者api编写教程

1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…

postgresql根据某个字段去重获取整行数据

背景&#xff1a;在一些情况下我们需要对数据进行去重统计&#xff0c;group by就行&#xff0c;但是一些特殊情况下我们要根据某个字段去重之后获取非聚合字段的值&#xff0c;这个时候在mysql非严格模式下可以直接执行&#xff0c;但是在严格模式和postgresql里面是直接报错的…

vue中数组常用的六种循环方法、VUE中list的各种方法和运用

简单记录一下&#xff0c;常用的六种数组循环的方法&#xff0c;分别是for()&#xff0c;map()&#xff0c;forEach()&#xff0c;filter ()&#xff0c;every()&#xff0c;some(); 一、for循环 let data [{name: 张三,age: 10}, {name: 李四,age: 20}, {name: 王五,age: 3…

k8s 对外服务之 Ingress(七层代理)

一 Ingress 简介 理论方面 1&#xff0c; k8s service 作用 对集群内部&#xff1a; 它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制 对集群外部&#xff1a; 对集群外部&#xff0c;他类似负载均衡器&am…

JAVA家政系统小程序源码,家政系统源码,支持店铺入驻接单,师傅入驻接单:专业团队自主研发的一套上门家政APP系统成品源码,支持商用

JAVA家政系统小程序源码&#xff0c;家政系统源码&#xff0c;支持店铺入驻接单&#xff0c;师傅入驻接单&#xff1a;专业团队自主研发的一套上门家政APP系统成品源码&#xff0c;支持商用 家政系统是一套可提供上门家政的系统&#xff0c;可在线预约开荒保洁、上门维修、美容…

Android 如何保证开启debug模式之后再启动

很多时候会需要debug看Android启动时候的一些数据&#xff0c;但很多时候会存在自己开启debug后app已经过了自己要debug的那段代码的时机了。 那么怎么样可以保证一定能让启动后不会错过自己要debug的那段代码执行的时机呢&#xff1f; 可以用下面这行命令&#xff0c;其中co…

废品回收小程序开发,助力商家拓展回收市场

随着互联网的快速发展&#xff0c;废品回收行业也走向了数字化发展&#xff0c;废品回收小程序成为了拓展市场的重要方式。在当下万亿元下的回收市场中&#xff0c;废品回收小程序的发展也能够发挥重要作用&#xff0c;提高市场回收效率&#xff0c;提高大众的回收意识&#xf…

前端开发入门指南:掌握网页设计的第一课

UI设计与前端开发是相辅相成&#xff0c;UI设计可以视觉美化产品界面&#xff0c;而前端开发可以通过代码实现设计稿。作为UI设计师&#xff0c;如果画出来的图片美观方便对前端开发者非常有益。如果设计复比较难以实现&#xff0c;沟通就会变得更加困难。因此&#xff0c;UI设…

Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

Python爬虫之保存图片到本地

Python爬虫之BeautifulSoup保存图片到本地 在网络爬虫的世界里&#xff0c;文字是丰富的养分&#xff0c;而图片则是色彩缤纷的果实。无论你是在收集艺术作品、建立产品目录&#xff0c;还是只是想保存那些令人惊叹的旅行照片&#xff0c;从网页上抓取并保存图片都是一项常见而…

高通开发系列 - 借助libhybris库实现Linux系统中使用Andorid库

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述Android代码下载和编译aarch64开发环境libhybris下载和编译libhybris测试验证调用库中的函数概述 我主要是基于…

从函数开始学习ABAP01

从函数开始学习ABAP01 函数接口创建步骤实例1&#xff1a;供应商信息同步相关知识函数的属性DATA定义时TYPE 和LIKE的区别IN CORRESPONDING FIELDS OF TABLE表连接判断内表是否不为空FOR ALL ENTRIES INREAD TABLESY-SUBRCSELECT 关键字运算符CONVERSION_EXIT_ALPHA_OUTPUTCALL…