- 运行过程
jvm将class文件编译为字节码文件,再由加载器进行加载(系统类加载器、扩展类加载器、引导类加载器)
再到链接阶段(验证、准备、解析)
- 初始化阶段
初始化加载顺序
1、父类静态成员和static块
2、子类静态成员和static块
3、父类普通成员和非static块
4、父类构造函数
5、子类普通成员和非static块
6、子类构造函数
- 类加载器分类
1、启动类加载器
负责加载Java_home/lib目录下的可以被虚拟机识别(通过文件名称,比如rt.jar\tools.jar)的字节码文件,与之对应的是Java.lang.classloader类
2、扩展类加载器
负责加载Java_home/lib/ext目录下的字节码文件,对应sun.misc.launcher类,此类继承于启动类加载器classloader
3、应用类加载器
负责加载classpath路径下的字节码也就是用户自己写的类,对应与sun.misc.launcher.appclassloader类,此类继承扩展类加载器launcher
4、自定义类加载器
需要继承系统类加载器classloader,并重写findclass方法,负责加载指定位置的字节码文件,通过类中的path变量指定
- 双亲委派机制
加载过程
原理:
1、如果一个类加载器收到了类加载的请求,它并不会自己加载,而是先把请求委托给父类的加载器执行
2、如果父类加载器还有父类,则进一步向上委托,依次递归,请求到达最顶层的引导类加载器。如果顶层类的加载器加载成功,则成功返回。如果失败,则子类加载器会尝试加载。直到加载成功。
- 沙箱安全机制
1、沙箱是一个限制程序运行的环境。
2、沙箱机制就是将Java代码限定在虚拟机jvm特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问
- 栈
1、运行时的单位
2、解决程序的运行问题,即程序如何执行,或者说如何处理数据
3、存放基本数据类型的局部变量,以及引用数据类型的对象引用
注意:对于栈来说不存在垃圾回收问题
- 堆
1、是存储的单位
2、堆解决的是数据存储的问题,即数据怎么放、放在哪儿
3、对象主要都是放在堆空间的,是运行时数据区比较大的一块
- 堆细分
1、新生区
1)伊甸园区
2)幸存者1区
3)幸存者2区
2、养老区(老年代)
3、元空间(永久区)
- 方法区
方法区
堆、栈、方法区的交互关系
- 方法区的理解
1、尽管所有的方法区在逻辑上属于堆的一部分
2、方法区可以看作是一个独立与Java堆的内存空间
3、方法区和Java堆一样,是各个线程共享的内存区域
- 方法区存储的信息
方法区用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等
- 垃圾回收机制
垃圾定义
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是 需要被回收 的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会被一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至 可能导致内存溢出。
- 垃圾回收相关算法
判断对象存活的两种方式
1、引用计数算法
对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况
2、可达性分析算法
可达性分析算法是以根对象为起始点,按照从上到下的方式搜索被根对象集合所连接的目标对象是否可达