当前位置: 首页 > news >正文

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();
    
  • 虚引用

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

相关文章:

  • selenium的使用教程
  • webshell工具流量特征
  • 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU
  • 【创作活动】面对层出不穷的AI大模型产品我们应该怎么选择?
  • 【JavaScript脚本宇宙】通知新风尚:打造互动性十足的Web提示系统
  • VB7/64位VB6开发工具office插件开发-twinbasic
  • 【Redis】redis高阶-使用zset实现延时队列
  • qt网络事件之QSocketNotifier
  • 拥抱生态农业,享受绿色生活
  • 软件测试--第三章 软件测试方法
  • java判断对象是否还在被引用
  • 【设计模式】装饰器模式(结构型)⭐⭐
  • linux常用命令及其选项
  • 手撸一个java网关框架
  • STM32使用HAL库时 UART ErrorCode
  • [iOS]Core Data浅析一 -- 启用Core Data
  • “大数据应用场景”之隔壁老王(连载四)
  • 0x05 Python数据分析,Anaconda八斩刀
  • Angularjs之国际化
  • ES10 特性的完整指南
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git的一些常用操作
  • java2019面试题北京
  • js中的正则表达式入门
  • Laravel核心解读--Facades
  • mysql innodb 索引使用指南
  • node 版本过低
  • overflow: hidden IE7无效
  • Vue官网教程学习过程中值得记录的一些事情
  • vue学习系列(二)vue-cli
  • vue自定义指令实现v-tap插件
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 搭建gitbook 和 访问权限认证
  • 如何在 Tornado 中实现 Middleware
  • 我的业余项目总结
  • 系统认识JavaScript正则表达式
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #知识分享#笔记#学习方法
  • $.ajax中的eval及dataType
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (多级缓存)多级缓存
  • (二)学习JVM —— 垃圾回收机制
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (转)详解PHP处理密码的几种方式
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./configure,make,make install的作用
  • .net framework4与其client profile版本的区别
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET性能优化(文摘)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • ??myeclipse+tomcat