都知道java是由C++发展来的,而C++中繁琐容易出错的东西就是垃圾回收,如果垃圾回收错误会导致程序或系统的不稳定甚至崩溃。
![8dae6944857ca2d12a53d294e80897ae.png](https://i-blog.csdnimg.cn/blog_migrate/640c99e31cc304e490ff0f1ce1007464.jpeg)
垃圾回收
Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,但是并没有提供释放已分配内存的显示操作方法。可以通过如下方式显示调用:
System.gc();
Runtime.getRuntime().gc();
实际开发中,并不建议手动去调用。因为显示调用是做堆内存全扫描,也就是 Full GC,是需要停止所有的任务的,会很影响程序正常执行。
既然有了GC,那还会不会造成内存溢出了呢?是肯定存在的
Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题。在Java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个是给对象赋予了空值null,以下再没有调用过,另一个是给对象赋予了新值,这样重新分配了内存空间。
引起内存溢出的几个案例:(代码实现,下次更新,这里只是文字描述)
1、集合类引起内存泄漏(如HashMap,HashSet);
2、内部类和外部模块的引用;
3、单例模式;
4、监听器;
5、各种连接(如数据库连接、io连接)
总结:面试必问的垃圾回收,这篇文章也只是简短的概括了下并没有说的很具体,但是笼统的说GC就是垃圾回收,帮助我们程序员进行垃圾回收,使用我们更加专注于业务代码的实现,其次GC内存溢出是肯定有的,相信在实际编码中也肯定遇见过,但是我们并没有去总结,这里概括了下大致发生内存溢出的情况,下一篇文章会使用代码进行演示。