java虚拟机 jvm
jvm整体结构

jvm内存空间
java 栈区 它存放的是java方法执行时的所有的数据
栈帧 一个栈帧代表一个方法 每个方法的调用就是一个栈帧在虚拟机栈中入栈和出栈
本地方法栈:专门为nativie方法服务,也是通过栈帧调用
方法区,存储被虚拟机加载的类信息,常量,静态变量等数据。
java堆:所有通过new创建的对象的内存都在堆中分配,是虚拟机中最大的一块内存,是gc要回收的部分

gc垃圾回收机制
垃圾收集算法
1,引用计数算法 对象被引用 计数器加1 (老算法,存在A-B相互引用,不会被回收)
2,可达性算法:从gcroot节点。寻找引用节点。没有引用的节点标记为垃圾节点,
4种引用类型
分为4种,用来控制对象的生命周期
强引用 不会被垃圾回收期回收,会抛出oom异常
软引用 在内存足够的情况下 不会去回收 效果和强引用一样
弱引用 生命周期比软引用少很多,在gc回收的时候,不管内存是否足够 都会回收他
虚引用 就是没有引用,垃圾回收期任何时候都会回收他
refercequene 一般和软引用,弱引用关联
如果软应用被垃圾回收期回收了 就会把这个引用加入到这个队列当中
垃圾回收算法
1,标记清除算法: 从根节点遍历,将不可达的引用标记,在gc执行的时候回收掉标记后的引用,缺点是会造成内存碎片
2,复制算法:从根节点遍历,复制所有可达的引用到一个新的内存,将原来的引用内存清空,不会产生碎片,但是效率比第一种差,(适合内存存活较少的时候)
3,标记整理算法:从根节点遍历,将不可达的标记,清除后, 更新指针,将引用对象往空闲区移动,避免产生内存碎片
jvm虚拟机触发垃圾回收的时机
1,java虚拟机无法在为新的对象分配内存空间的时候
2,手动调用system.gc
3,低优先级的gc线程被启动
java源代码编译过程 java-class的过程如下


dalvik和jvm的不用
1,加载文件的格式不同一个加载class,一个加载dex
2,jvm只能存在一个,dvm可以存在多个
3,dvm是基于寄存器的,jvm是基于栈的
art
dvm使用jit将字节码转换成机器码 效率低
art采用aot预编译技术,执行数据更快
网友评论