System.gc() 调用附带一个免责声明,无法保证对垃圾回收器的调用
一般情况下,垃圾回收应该是自动进行的,无需手动触发,否则就过于麻烦了
没有空闲内存,并且垃圾回收器也无法提供更多的内存(在报 OutOfMemoryError 之前,一定会调用一个 gc())
没有空闲内存:
1、Java 虚拟机的堆内存设置不够
2、代码中创建了大量的对象,并且长时间不能被垃圾收集器收集(存在被引用)
内存泄漏严格来说,在只有对象不会再被程序用到了,但是 GC 又不能回收他们的情况,才叫内存泄漏。
举例:
1、单例模式
单例的生命周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么外部对象是不能被回收的,则会导致内存泄漏的发生
2、一些提供 close 资源未关闭导致内存泄漏
数据库连接 dateSource.getConnection(),网络连接 socket 和 io 连接必须手动 close,否则不能被回收,导致内存泄漏
并发:
并发并不是真正意义上的 “同时进行” 而是 CPU 把一个时间短划分成几个时间片段,然后在这几个时间区间之间来回切换,由于 CPU 处理的速度很快,只要时间间隔处理得当,即可让用户感觉是多个程序同时进行
并行:
当系统有一个以上的 CPU 时,两个进行互不抢占 CPU 的资源,可以同时进行,这种我们成为并行
决定并行的因素不是 CPU 的数量,然是 CPU 核心数量,比如一个 CPU 多核也可以并行
并行与并发的对比:
并发的多个任务之间互相抢占资源
并行的多个人物之间不互相抢占资源
面试题:强引用,软引用,弱引用,虚引用有什么区别,具体的使用场景是什么?
四中引用强度依次逐渐减弱,除了强引用以外,其他三种引用都能在 lang 包下的 ref 包中找到
强引用:类似 Object obj = new Object 这种关系,只要强引用的关系还存在,那么垃圾回收器就永远不会回收被引用的对象(打死也不回收)
软引用:在系统将要发生内存溢出之前,会把这些对象列入回收范围之中进行二次回收,如果回收后害没有足够的内存,才会抛出异常(内存不足,才会回收)
被弱引用生成的对象,只能存活到下一次垃圾收集之前,当垃圾回收器工作时,无论内存空间是否足够,都被回收
虚引用,唯一目的是能够在这个对象被回收的时候,收到一个系统的通知



