3.1 判断对象是否为垃圾的算法

对象被判定为垃圾的标准:没有被其他对象引用。

1. 引用计数算法:通过判断对象的引用数量来决定对象是否可以被回收;每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。优点︰执行效率高,程序执行受影响较小;缺点∶无法检测出循环引用的情况,导致内存泄露。

2. 可达性分析算法:通过判断对象的引用链是否可达来决定对象是否可以被回收。可以作为GC Root的对象①虚拟机栈中引用的对象(栈帧中的本地变量表)②方法区中的常量引用的对象③方法区中的类静态属性引用的对象④本地方法栈中JNI ( Native方法)的引用对象⑤活跃线程的引用对象。

3.2 谈谈你了解的垃圾回收算法

标记-清除算法(Mark and Sweep):标记∶从根集合进行扫描,对存活的对象进行标记;清除∶对堆内存从头到尾进行线性遍历,回收不可达对象内存。缺点:碎片化。

复制算法:分为对象面和空闲面,对象在对象面上创建,存活的对象被从对象面复制到空闲面,然后将对象面的所有对象内存清除。优点:解决碎片化问题,顺序分配内存,适用于对象存活率低的场景。

标志-整理算法:是在标记-清除算法的基础上,增加了整理的步骤。标记︰从根集合进行扫描,对存活的对象进行标记;整理∶移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。

分代收集算法:

Minor GC用于年轻代(生命周期短);Full GC:用于年轻代+老年代;Major GC:有的地方等同于Full GC,有的地方单单指老年代的GC。

对象如何变为老年代?

经历一定Minor次数依然存活的对象;Survivor区域放不下的对象;新生成的大对象。

常见的性能调优参数:①SurvivorRatio:Eden和Survivor的比值,默认8:1;②NewRatio:老年代和年轻代的内存大小比例;③MaxTenuringThreshold:对象从年轻代晋升到老年代经过的GC次数的最大阈值。

触发Full GC的条件

1.老年代空间不足 2.永久代空间不足:针对JDK8以前的版本3.调用System.gc()调用了程序来决定要不要回收。(回答这三条基本足够)

4. 使用远程方式管理的JDK应用,每小时执行1次Full Gc 5. CMS GC时出现promotion failed, concurrent mode failure 6. Minor GC晋升到老年代的平均大小大于老年代的剩余空间调用。

3.3 常见的垃圾收集器

Stop-the-World发生时,除了GC所在的线程,其他线程都处于停顿状态

Safepoint安全点,到达安全点停顿下来,一般在方法调用、循环跳转、异常跳转等地方。

JAVA的运行模式有两种,Server与Client 可以通过java -version 来获取。

垃圾收集器图-连线表示可以并存

Serial收集器:单线程收集,进行垃圾收集时,必须暂停所有工作线程简单高效,Client模式下默认的年轻代收集器。

ParNew收集器:多线程,其他和Serial一样,单核效率不如Serial。

Parallel Scavenge收集器:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),更关注系统的吞吐量。在多核下执行才有优势,Server模式下默认的年轻代收集器。

老年代:

Serial Old收集器:单线程收集,进行垃圾收集时,必须暂停所有工作线程;简单高效,Client模式下默认的老年代收集器;采用标记-整理算法。

Parallel Old收集器:多线程,吞吐量优先。

CMS收集器:标记-清除算法,会带来内存空间碎片化的问题。①初始标记: stop-the-world②并发标记∶并发追溯标记,程序不会停顿③并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象⑤重新标记︰暂停虚拟机,扫描CMS堆中的剩余对象⑥并发清理∶清理垃圾对象,程序不会停顿。

Garbage First并行和并发;分代收集;标记-整理算法,空间整合;可预测停顿;年轻代和老年代不再物理隔离

3.4 Object的finalize()方法的作用是否与C++的析构函数作用相同

finalize方法是在垃圾回收时,用于确认该对象是否确认被回收的一个标记过程。确认一个对象真正被回收需要经历两次标记过程:可达性分析没有引用,这是第一次标记,放入F-Queue队列中;finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记。finalize方法不是一定会执行,对象可以在finalize方法中获得自救,避免自己被垃圾回收,同样自救也只能一次。

不相同,析构函数调用确定,而finalize()方法是不确定的。

3.5 Java中的强引用,软引用,弱引用,虚引用有什么用

强引用(Strong Reference):

Object obj =new Object();

抛出OutOfMemoryError终止程序也不会回收具有强引用的对象;通过将对象设置为null来弱化引用,使其被回收。

软引用(Soft Reference):

String str =new String("ABC");//强引用
SoftReference<String> softRef =new SoftReference<String>(str);

对象处在有用但是非必须的状态,只有当内存空间不足时,GC才会回收该对象的内存,可以实现高速缓存。

弱引用(Weak Reference )

String str =new String("ABC");//强引用
WeakReference<String> softRef =new WeakReference<String>(str);

非必须的对象,比软引用更弱一些;GC时会被回收;回收的概率也不大,因为GC线程优先级比较低;适用于引用偶尔被使用且不影响垃圾收集的对象。

虚引用(PhantomReference ):

String str =new String("ABC");//强引用
ReferenceQueue queue =new ReferenceQueue<>();
PhantomReference ref =new PhantomReference<>(str,queue);

不会决定对象的生命周期;任何时候都可能被垃圾收集器回收;跟踪对象被垃圾收集器回收的活动,起哨兵作用;必须和引用队列ReferenceQueue联合使用.

3.Java垃圾回收机制面试题相关推荐

  1. 一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...

  2. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  3. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  4. java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法

    一.Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者 ...

  5. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  6. 深入理解 Java 垃圾回收机制

    转载自 http://www.cnblogs.com/andy-zcx/p/5522836.html 深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java  语言中一个显著的特点就是引入 ...

  7. java垃圾回收机制的理解

    Java垃圾回收机制算法 标记----清除算法 复制算法 标记----整理算法 分代收集算法 为什么要进行垃圾回收 因为当一个对象的引用不可达,或者一个对象没有任何引用指向它,那么它就没有必要在内存中 ...

  8. 【Java】Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  9. Java深度历险(四)——Java垃圾回收机制与引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

  10. axis2 webService开发 附深入理解 Java 垃圾回收机制

    相关文章: axis web服务(axis2安装和eclipse.tomcat结合开发) axis2 webService开发 axis2 webService开发(打包aar文件) 使用Axis2开 ...

最新文章

  1. Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()
  2. JavaScript基础初始时期分支(018)
  3. 洛谷 P3805 manacher算法
  4. 推荐一些优秀的JavaScript开发框架
  5. windows/Linux 安装 MongoDB 3.6.5
  6. python增加一列数据_python数据怎么添加列?
  7. mysql 5.5数据库主从配置步骤详解
  8. 事件和委托的编译代码
  9. Base64编码详解及其变种(解决加号在URL变空格问题)
  10. jpeglib的jpeg_finish_compress函数疑似越界
  11. 没有人能随随便便成功,但没有必要活得像尘埃一样卑微
  12. 如何快速求出与n互素的数有多少个?
  13. 认识计算机课件小游戏,2013年小学信息技术教案《认识计算机二》教案
  14. python控制多个屏幕_多设备控制 + 屏幕操作录制重放 实现完整多设备测试流程...
  15. JavaScript 实现微信公众号内分享功能
  16. C# = Lambda表达式理解
  17. python考试时函数名记不到怎么办?
  18. 晨曦记账本,使用项目图表统计收支账户
  19. python教程是什么课文_python : 新概念英语 课文转为html
  20. 跨境电商在电商行业中是否还有立足之地?

热门文章

  1. linux文件管理器thunar,文件管理器:Nautilus,Thunar,PCManFM,Konqueror,Dolphin,Krusader
  2. 利尔达携手紫光展锐重磅发布5G R16模组,领跑5G To B新纪元
  3. UE4蓝图基础01-开发环境安装
  4. 王道计算机考研机试指南部分代码
  5. 如何学习opencv
  6. 淘宝京东拼多多淘客源码,三合一淘客php源码cms搭建教程
  7. 推荐个工作日志的软件nyfedit
  8. 基于Java实现的天气预报APP安卓项目MyWeather
  9. 多尺度图像增强Retinex相关算法学习及实现
  10. dw2xls已升级至pb11.5