文章目录
-
JVM组成:
- 类加载子系统(加载【系统类加载器–>扩展类—>启动类】、链接【验证+准备(类变量默认赋值)+解析(符号引用变为直接引用)】、初始化【执行<clinit.>类变量和静态代码块的显式赋值】)
- 运行时数据区
- 虚拟机栈(每个线程在创建时都会创建一个虚拟机栈,内部存栈帧,对应着一次次的 Java 方法调用)
- 局部变量表(存了方法中定义的变量,基本数据类型直接存,引用类型存引用指向堆中的实际对象)
- 操作数栈(用于保存中间结果)
- 动态链接(符号–>直接引用)
- 方法返回地址
- 本地方法栈
- PC
- 堆(字符串常量池和静态变量)
- 年轻代(minorGC)
- 老年代(MajorGc 和Full GC)
- 方法区
- 虚拟机栈(每个线程在创建时都会创建一个虚拟机栈,内部存栈帧,对应着一次次的 Java 方法调用)
- 执行引擎
-
局部变量有什么好处
-
对象头
Mark word(GC 、hash值、锁信息 )+类型指针 -
字符串常量池
- 是一个固定大小的 Hashtable
-
怎么判断一个对象能否被回收?
首先由GCroot经过可达性分析算法看这个对象是否在引用链上,没有的话说明这个对象是垃圾,再看是否重写了finalize()方法,如果在 finalize()方法中与引用链上的任何一个对象建立了联系,那么就不会删除,否则就删除了。 -
三种垃圾收集算法
- 标记–清除算法:先标记,可达对象会在对象头标记一下,然后遍历堆内存,将可达的对象留下来,其他的垃圾清理掉(会产生内存碎片,需要维护空闲链表)
- 标记–复制算法:先标记,内存分为两部分,将标记的存货对象按序的放入第二部分内存,当前这部分内存全部清理。(内存利用率50%,不会有内存碎片)
- 标记–压缩算法:先标记,将存活的对象压入内存的一端
- 年轻代一般用标记复制算法,因为这些对象一般都很短暂,幸存者0区和幸存者1区这样的来回复制开销不会很大,老年代的话一般是标记清除和标记压缩,这个的话就要看是哪个垃圾回收器了。
-
强软弱虚引用:
强引用——不回收,OOM也不回收
软引用:内存不足才回收
弱引用:只要发生GC,就回收
软引用、弱引用都非常适合来保存那些可有可无的缓存数据。当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间,从而起到加速系统的作用。
虚引用:对象回收的跟踪 -
垃圾回收器
CMS和G1是两款并发的垃圾回收器,CMS只作用在老年代(标记清除,会有内存碎片),G1年轻代和老年代(分区)
G1: