GC垃圾回收

Posted wanli002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GC垃圾回收相关的知识,希望对你有一定的参考价值。

  关于Java的GC垃圾回收过程中,一些概念和过程的整理和理解。

1.1 堆

  堆(Heap)是Java虚拟机中内存最大的一块区域,被所有线程共享,主要存放对象实例。

1.2 栈

  栈(Stack)是线程私有的,生命周期与线程相同。每个方法在执行时都会创建一个栈帧用于存储局部变量表,操作数帧,方法出口信息等,执行过程对应栈帧在虚拟机中入栈到出栈的过程。

1.3方法区

  方法区(Method Area)是各个线程共享的内存区域,主要存储已被虚拟机加载的类信息,常量等信息。

1.4内存溢出

区域 方法区
内存溢出方法 循环new对象 方法递归调用 循环String.intern()

  intern方法的作用,字符串常量池中收已包含等于次string对象的字符串,有则返回,没有就添加到常量池中,返回对象的引用。

2.1可达性分析

  GC回收判断对象存活,通过一系列的GC Roots对象作为起始点,从节点向下搜索,(按照图论的观点,从GC Roots到这个对象不可达)。

2.2分代收集

年轻代(Minor GC)

  使用复制算法,1个Eden(有意思,看翻译是伊甸园,《圣经》中亚当和夏娃最初居住的地方),2个相等大小的surivivor(存活区,字面意思好理解)1和2,GC速度快,效率高。存活次数足够大时,升级到老年代。

老年代(Full GC)

  新生代GC,又有新对象到老年代时,区域不够则触发老年代GC 标记-清理,或者标记-整理。整理的过程是在标记之后,让所有的存货对象都向一段移动,直接清理掉边界意外的内存,防止碎片化。

 3.1魔数

  每个class文件的头4个字节称为魔数(Magic Number)其值为:0xCAFEBABE,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件 拓展名可以随意改动

4.1双亲委派模型

  如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

5.1静态分配和动态分配

  jvm在编译期间方法调用的过程,确定调用哪个版本。

方法分派静态分派(绑定)动态分派
应用 重载(方法名相同,参数不同) 重写(父类方法)

Human man =new Man();

Human是静态类型(static type),Man是实际类型(actual type)。静态分派发生在编译阶段,根据参数的静态类型选择版本 静态类型相同时,根据实际类型来确定方法执行版本。

6.1解语法糖

  虚拟机在运行时不支持这些语法,在编辑阶段还原回简单的基础语法结构。

6.2泛型

  在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。

以上是关于GC垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

GC垃圾回收(3)- 三色标记算法

jvm基础--GC垃圾回收机制

从垃圾回收GCDetails看JVM GC原理

java中是怎样进行垃圾回收的?

6.GC垃圾回收算法和垃圾收集器的关系

「JVM基础」——垃圾回收基础(GC相关)