Java内存区域
运行时数据区:
- 程序计数器:当前线程所执行的字节码的行号指示器,如果正在执行的是Native方法,这个计数器值则为空。
- Java虚拟机栈:用于存储局部变量表(基本数据类型、对象引用和returnAddress类型)、操作数栈、动态链接、方法出口等信息,是线程私有的,它的生命周期与线程相同。
- 本地方法栈:Native方法服务
- Java堆:内存最大的一块,被所有线程共享的一块内存区域,所有的对象实例和数组都要在堆上分配。
- 方法区:被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
- 运行时常量池(方法区的一部分):存放编译期生成的各种字面量和符号引用:String类的intern()方法。具有动态性。
判断对象已死:
- 引用计数算法
- 根搜索算法:“GC Roots”,引用链
引用:
- Strong Reference 强引用
- Soft Reference 软引用
- WeakReference 弱引用:只能生存到下一次垃圾收集发生之前
- 虚引用:PhantomReference
垃圾收集算法:
- 标记-清除算法:标记和清除的效率都不高,标记清除之后会产生大量不连续的内存碎片。
- 复制算法:新生代:将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor,用老年代分配担保。
老年代:标记整理算法