JVM的结构:
Java源文件编译生成class文件
类加载器
加载流程:
Loading:类的信息从文件中获取并载入到JVM的内存里
Verifying:检查读入的结构是否符合JVM规范的描述
Preparing:分配一个结构来存储类的信息
Resolving:把这个类的常量池中所有的符号引用改变成直接引用
Initalizing:执行静态初始化程序,把静态变量初始化成指定的值
JVM的内存管理
Java栈区:
作用:它存放的是Java方法执行时的所有数据
组成:由栈帧组成,一个栈帧代表一个方法的执行
Java栈帧:
每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
局部变量表、栈操作数、动态链接、方法出口
本地方法栈:
作用:本地方法栈是专门为native方法服务的
方法区:
存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据
堆区:
作用:通过所有new创建的对象的内存都在堆中分配
特点:是虚拟机中最大的一块内存,是GC要回收的部分
垃圾回收:
垃圾回收算法:
引用计数算法:通过是否引用来判断是否要回收,(缺点,如果有不可达的引用,就不能回收)
可达性算法(根搜索算法):
引用的类型:
强引用、软引用、弱引用、虚引用
最常用的就是强引用和弱引用
回收算法:
缺点:造成内存碎片
成本较高,适合在数量少的引用时使用
触发回收:
Java虚拟机无法再为新的对象分配内存空间
手动调用System.gc()方法(强烈不推荐)
低优先级的GC线程被运行时就会执行GC