java初阶——JVM
JVM指的是Java虚拟机虚拟机是指通过软件模拟具有完整硬件功能的运行在一个完全隔离环境的完整计算机系统。JVM内存区域划分1.程序计数器记录指令执行到哪个地址2.元数据区方法区存储被虚拟机加载类的信息、常量、静态变量、即时编译器编译后的代码等数据。java进程共用一份3.栈保存方法调用关系4.堆JVM最大空间区域对象不使用则进行回收保存new的对象java进程共用一份Test tnew Test();1.t如果是局部变量保存到栈上2.是成员变量保存到堆上3.是静态成员变量保存到元数据区JVM类加载.class文件-内存中的类对象流程1.加载找到.class文件2.验证解析校验class文件是否合法3.准备给类变量static 修饰的变量申请内存空间并且设置默认0值4.解析针对字符串常量进行初始化将常量池的符号引用替换为直接引用的过程。5.初始化类变量进行初始化也会触发父类的类加载没有static的其他变量不属于类加载的流程只会在创建对像new)的时候跟着对象一起初始化。类加载时机1.构造示例2.调用静态属性方法3使用某个类且它的父类未进行加载加载他的父类。双亲委派模型描述类加载中根据全限定类名找到.class文件的流程类加载器JVM中专负责类加载的模块JVM默认提供三种类加载器1.BootstrapClassLoader-java标准库的目录2.ExtensionClassLoader-java扩展库的目录3.ApplicationClassLoader-java的第三方库/当前的项目双亲委派过程进行类加载通过全限定类名找.class的时候把ApplicationClassLoader作为入口然后把加载类的任务委托给其父亲进行ExtensionClassLoader也不会立即查找而是委托给父亲BootrapClassLoader没有父加载器只能自己进行类加载根据类名找到标准库是否存在匹配的.class文件BootrapClassLoader没有找到再将任务还给孩子ExtensionClassLoader根据类名再扩展库进行查找找到进行类加载没找到将任务还给孩子ApplicationClassLoader根据类名在第三方目录/项目目录中查找找到进行类加载没找到抛出异常。JVM的垃圾回收GCGC回收JVM的区域内存区域内存释放方式是否参与GC程序计数器线程销毁自动释放不参与栈方法结束栈帧就结束随之释放不参与元数据区类对象一般不会释放不参与堆创建新对象也有旧对象消亡垃圾回收器主动回收不再被引用的对象参与GC工作流程1.找到垃圾不再被引用的对象1)引用计数每个对象在new的时候都带有一个小的内存空间保存一个数字用来记录有多少个引用指向他当这个数字为0就成为了垃圾。问题消耗内存可能更加多尤其是当对象本身较小的情况下使得引用计数的空间比例更加大出现循环引用的问题虽然a和b对象赋值为null但Test类的引用不为0而且都无法使用2)可达性分析1.以代码的某些特定对象作为遍历的起点。2.尽可能遍历判断对象是否能够访问到3.每次访问一个对象就把对象标记成为可达当完成所有遍历后就知道哪些是可达以及不可达不可达就是垃圾1.如何释放垃圾1标记清除把垃圾对象直接进行释放缺点内存空间直接进行释放后空闲的空间不会进行连续会导致即使有足够的空闲空间但是无法使用2)复制算法只使用一边空间把不是垃圾的对象拷贝到另一边可以确保空闲空间连续缺点1.空间利用率低2.一旦不是垃圾的对象多复制成本高3标记整理优点解决内存碎片保证内存利用率缺点搬运数据开销仍然大复制成本高4分代回收java使用代对象GC的轮次新时代对象易挂-GC的频次要提高老年代对象可能继续存在-GC的频次降低第一轮GC过后幸存的对象移入幸存区其他进行回收新一轮的GC再将幸存的对象移入新幸存区到一定次数就晋升到老年区。新生代对象大部分会快速消亡复制开销小老年代大部分对象生命周期长整理的开销也小