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垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章