GC相关
一 classloader类加载器
当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载
1 什么是类加载器
ClassLoader就是用来动态加载class文件到内存当中用的
2 类加载器类型
(站在程序员角度)
Bootstrap ClassLoader 启动类加载器【底层是C++编写的】
Extension ClassLoader 扩展类加载器
App ClassLoader 应用程序类加载器
(站在java虚拟机的角度)
启动类加载器
所有其他的类加载器【采用java语言实现的】这些都需要由启动类加载器加载之后才能加载其他的类
3 双亲委托模型
每层的上层为父加载器【非继承关系】
先把任务交给父类,父类不能加载则交给子类加载

4 类加载的过程

动态绑定,静态绑定
1、第一步-加载
1)通过一个类的全限定名来获取其定义的二进制字节流
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据
3)在Java堆中生成一个代表这个类的Java.lang.class对象,作为对方法去中这些数据的访问入口
【通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Class对象】
2、第二步-验证
1)为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求
2)文件格式的验证、元数据的验证、字节码验证和符号引用验证
3、第三步-准备----实际为java语法
1)对基本数据类型--可以默认赋值
2)对于同时被static和final修饰的常量--必须显示赋值
3)对于引用数据类型 reference--如果没有对其赋值,则系统默认赋值为null
4)在数组初始化时
4、第四步-解析

1)类或接口的解析
2)字段解析
3)类方法的解析
4)接口方法解析
5、第五步-初始化
初始化阶段是执行类构造器()方法的过程
6、使用
7、卸载
二 GC---java中堆与栈相关
1 java程序运行时的内存分配策略
1)静态存储区(方法区):主要存放静态数据、全局static数据和常量
【在程序编译的时候就已经分配好了,并且在整个程序运行期间一直存在】
2)栈区:方法体内的局部变量都在栈上创建
【当方法被执行时,方法体内的局部变量在栈上创建一个内存区,并在方法执行完成后,这些局部变量所持有的内存被释放。。。。效率极高,容量有限】
3)堆区:通常就是指在程序运行时直接new出来的内存
【这部分内存在不使用时,就会有垃圾回收器负责回收】
2 栈内存/堆内存的区别
从内存分配角度
在方法体内定义的(局部变量)一些基本类型的变量和对象的引用变量都是在方法的栈内存中分配的。
堆内存用来存放所有由new创建的对象(包括该对象其中的所有成员变量)和数组。
在堆分配的内存,将由Java垃圾回收器来自动管理
3 Java内存回收机制

4 Java内存泄露引起的原因
长生命周期的对象持有短生命周期对象的引用就很有可能发生内存泄露
【这是因为短生命周期的对象实际上已经不需要了,但是因为长周期的对象持有其引用,而导致它不能被回收】
5 总结
堆:运行时,垃圾回收,动态分配内存,存取速度较慢
栈:存取速度块,生命周期【跟生命周期是绑定的】
网友评论