JVM垃圾回收
GC对象的判定:
1.引用计数法:给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.
缺陷:就是无法解决循环引用问题,也就是说当对象A引用对象B,对象B又引用者对象A,那么此时A,B对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法(重点不要用)
2.可达性算法:从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。
GC Roots的对象:
a.虚拟机栈中引用的对象
b.方法区类静态属性引用的对象
c.方法区常量池引用的对象
d.本地方法栈JNI引用的对象
JVM垃圾回收:
GC的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停
(1)对新生代的对象的收集称为minor GC;
(2)对旧生代的对象的收集称为Full GC;
(3)程序中主动调用System.gc()强制执行的GC为Full GC。
不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:
(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)
(3)弱引用:在GC时一定会被GC回收
(4)虚引用:由于虚引用只是用来得知对象是否被GC
Java的内存分配和回收策率
1.对象优先在堆的Eden区分配。
2.大对象直接进入老年代.
3.长期存活的对象将直接进入老年代.
最后Minor GC和Major GC重点考:
当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GC.Minor Gc通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生Gc的频率较高,回收速度比较快;Full Gc/Major GC 发生在老年代,一般情况下,触发老年代GC的时候不会触发Minor GC,但是通过配置,可以在Full GC之前进行一次Minor GC这样可以加快老年代的回收速度。
你知道哪几种垃圾收集器?
我就简单的画个图,内容挺多的,不容易啊!
Java类加载机制:
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型
类加载器双亲委派模型机制:
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载
类加载器:
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。
其实感觉想要真的学习JVM可以去看书,网页上的知识还是太片面了,学习还是需要严谨的。
一个人修行论:可能还是喜欢一个人待着,哪怕孤独,也接收不了这万般喧闹的世界,真的沉浸在自己的孤独空间里,其实是没有孤独的,所谓的孤独只是别人对你的可怜称呼,但别人不知你并不需要,或者你并不孤独,万人的广场是万人的孤独,一人的房间可能是自己的狂欢。