面试题:JVM,GC垃圾回收机制

原创 2018年04月17日 13:04:50

GC(垃圾收集),那收集回收的是什么呢?是内存,所以在了解垃圾回收机制之前,要对Java内存有一个了解。

一,Java内存

这里写图片描述

GC主要就是在Java堆中进行的。
Java堆:Java虚拟机管理的内存中最大的一块,所有线程共享,几乎所有的对象实例和数组都在这类分配内存。
堆内存又分为:新生代和老年代,并且一般新时代的空间比老年代大。

了解了Java内存,接下来就来了解一下GC原理:

二.垃圾回收机制

一)GC的主要任务:
1.分配内存;
2.确保被引用对象的内存不被错误的回收;
3.回收不再被引用的对象的内存空间
二)垃圾回收机制的主要解决问题
1.哪些内存需要回收?
2.什么时候回收?
3.如何回收?

针对问题一,垃圾收集器会对堆进行回收前,确定对象中哪些是“存活”,哪些是”死亡“(不可能再被任何途径使用的对象)
判断方法:
1.引用计数算法
每当一个地方引用它时,计数器+1;引用失效时,计数器-1;计数值=0——不可能再被引用。

//举例:
        Test test1 = new Test();
        Test test2 = new Test();
        test1.obj = test2;
        test2.obj = test1;
        //test1 ,test12能否被回收?
        System.gc();

查看运行结果,会发现并没有因为两个对象互相引用就没有回收,因此引用计数算法很难解决对象之间相互矛盾循环引用的问题。

2.可达性分析算法:
向图,树图,把一系列“GC Roots”作为起始点,从节点向下搜索,路径称为引用链,当一个对象到GC Roots没有任何引用链相连,即不可达时,则证明此对象时不可用的。

举例:一颗树有很多丫枝,其中一个分支断了,跟树上没有任何联系,那就说明这个分支没有用了,就可以当垃圾回收去烧了。
注:在Java中可作为GCRoots的对象:
1).虚拟机栈(栈帧中的本地变量表)中引用的对象;
2).方法区中类静态属性引用的对象;
3).方法区中常量引用的对象;
4).本地方法栈中JNI引用的对象

针对问题2——什么时候回收?
即使是被判断不可达的对象,也要再进行筛选,当对象没有覆盖finalize()方法,或者finalize方法已经被虚拟机调用过,则没有必要执行;
如果有必要执行——放置在F-Queue的队列中——Finalizer线程执行。
注意:对象可以在被GC时可以自我拯救(this),机会只有一次,因为任何一个对象的finalize()方法都只会被系统自动调用一次。并不建议使用,应该避免。使用try_finaly或者其他方式。

问题3——如何回收,这就牵扯到垃圾收集算法和垃圾收集器
垃圾收集算法:
1.标记—清除算法
两个阶段:标记,清除;
不足:效率问题;空间问题(会产生大量不连续的内存碎片)
2.复制算法
将可用内存按容量分为大小相等的两块,每次都只使用其中一块;
不足:将内存缩小为了原来的一半
新生代
3.标记—整理算法
标记,清除(让存活的对象都向一端移动)
老年代

垃圾收集器:
这里写图片描述

最后来讲一下流程。
新建的对象再新生代中,如果新生代内存不够,就进行Minor GC释放掉不活跃对象;如果还是不够,就把部分活跃对象复制到老年代中,如果还是不够,就进行MajorGC释放老年代,如果还是不够,JVM会抛出内存不足,发生oom,内存泄漏。


学习参考:
《深入理解Java 虚拟机》
https://blog.csdn.net/antony9118/article/details/51375662

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36027342/article/details/79973294

JVM架构和GC垃圾回收机制(JVM面试不用愁)

JVM架构和GC垃圾回收机制 JVM架构图分析 JVM被分为三个主要的子系统: 1.  类加载器子系统 2.  运行时数据区 3.  执行引擎 1. 类加载器子系统 Java的动态类加载功能是由类加...
  • aijiudu
  • aijiudu
  • 2017-06-10 16:49:15
  • 3362

面试总结:java程序执行过程 + JVM内存管理 + GC垃圾回收机制

java程序执行过程 +JVM内存管理 + GC垃圾回收机制1、Java程序执行过程一个java程序的编译和执行过程如下: .java ——编译——> .class 类加载器负责加载各个字节码文件(....
  • u010429424
  • u010429424
  • 2017-08-17 19:15:26
  • 1630

JVM内存模型及垃圾回收机制

JVM内存模型 1、栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。存储局部变量、引用、方法、返回值等。 StackOverflowError:如果在线程执...
  • zhangpengju999
  • zhangpengju999
  • 2013-09-17 15:22:15
  • 15126

Java面试之垃圾回收总结

1. JVM垃圾回收机制与实现 堆:所有的对象实例与数组,GC堆,分为新生代与老年代 栈:栈帧包含局部变量表(基本数据类型 8种、对象引用类型)、操作数栈、动态链接、方法出口 方法区:类信息、常量、静...
  • u014762921
  • u014762921
  • 2017-03-09 15:54:51
  • 5539

深入理解JVM(六)-Java垃圾回收机制GC

对于C/C++开发者来说,他们在内存管理方面具有至高的权利,但是也承担着巨大的维护责任。而对于Java程序员来说,有了JVM(Java虚拟机)管理机制的帮助,再也不用担心内存泄漏和内存溢出问题了。因此...
  • dingji_ping
  • dingji_ping
  • 2016-03-31 20:51:22
  • 1418

JVM GC(垃圾回收机制)

写文章 Java性能优化之JVM GC(垃圾回收机制) Java的性能优化,整理出一篇文章,供以后温故知新。 JVM GC(垃圾回收机制) 在学习Java GC 之前,...
  • sinat_34979383
  • sinat_34979383
  • 2017-03-27 08:03:40
  • 772

JVM 垃圾回收机制主要原理

对于垃圾JVM的垃圾回收机制这里我们称为GC,众所周知,java语言不需要像c++那样需要自己申请内存,自己释放内存,这些都是JVM帮我们做好了的,但是对于一名java程序员,想要更近自己的水平更上一...
  • qq_33048603
  • qq_33048603
  • 2016-10-03 14:21:09
  • 14325

JVM相关面试题及答案

1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序 答:先静态、先父后子。 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块...
  • zd836614437
  • zd836614437
  • 2017-03-20 15:47:37
  • 29120

Minor GC、Major GC和Full GC之间的区别及JVM内存分布,JVM垃圾回收初解-JVM

JVM 内置的通用垃圾回收原则。堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,代假设和其他不同的 GC 算法超出了本文讨论的范围。 Minor GC...
  • u014490157
  • u014490157
  • 2016-09-22 20:26:31
  • 1287

JVM内存分区和垃圾回收GC机制

JVM内存分区JVM(Java virtual machine),即Java虚拟机,它的厉害之处在于平台无关性,“一处编写,到处运行”。JVM通过执行目标字节码(.class),解释在不同平台上的机器...
  • linshijun33
  • linshijun33
  • 2016-07-20 20:55:50
  • 1475
收藏助手
不良信息举报
您举报文章:面试题:JVM,GC垃圾回收机制
举报原因:
原因补充:

(最多只允许输入30个字)