JVM随笔
1.JVM是什么?有啥用?
JVM是一个虚拟计算机,他是字节码执行引擎,还能优化JAVA字节码,把字节码转换成效率更高的机器命令.java的跨平台的特性就是以此为支撑的.
2.JVM结构
JVM从上到下分别是类加载器->内存模型->执行引擎->本地库接口->本地方法区,大致结构如下图
3.类加载器:JVM的入口,负责把class文件加载到JVM中.
3.1 类加载器分为三类,从上到下分别是bootstrop classload,extention classload,app classload,这样的分法保证了java核心类库的安全
1.bootstropClassload(核心类加载器):负责加载java核心类库,JRE/lib下的jar包
2.extentionClassload(扩展类加载器):负责加载java扩展类库 ,JRE/lib/ext下的jar包
3.appClassload(系统类加载器):加载当前应用的所有类
3.2 类加载器加载机制:
双亲委派机制:通俗的讲就是父类能加载的优先让父类加载,顺序如下:bootstropClassload--->extentionClassload--->appClassload
4.JVM内存模型:堆,栈(虚拟机栈,本地方法栈),方法区,程序计数器
4.1 程序技术器:记录正在执行的字节码的地址.程序 分支,循环,异常处理都以来 这个
4.2 虚拟机栈:为虚拟机提供JAVA服务,存放局部变量和对象引用
4.3 本地方法栈:为虚拟机提供本地native方法支持
4.4 堆:对象实例,数组
4.5 方法区:也叫永久区,里面放一些静态变量,常量,类信息
堆内部分两块,分别是新生区和老年区,新生区包括伊甸园区,幸存一区,幸存二区
当我们去创建一个对象的时候, 对象首先会存在伊甸区中,当伊甸区满的时候会出发GC进行youngGC ,随后剩下的对象会进入到幸存区,在幸存区经历多次youngGC还能留存下来的对象会进入老年区,老年区如果满了会触发fullGC,经过多轮fullGC后的对象会进入永久区(方法区)
5.垃圾回收器(GC)
5.1 垃圾回收器分类:
串行:单线程,垃圾回收时用户进程处于等待状态
并发:单线程,垃圾回收进程和用户进程交替进行
CMS:多线程,使用标记清除法
G1:多线程,使用分代回收机制
注:分代回收机制:内存上的新生区和老年区分开,并根据其特点选择不同的垃圾回收器
新生代存活少垃圾多,使用标记整理法;老年区存活多垃圾少,使用复制算法
5.2 算法:
标记清除法:容易产生碎片
标记整理法:效率低(有整理的过程)
复制法:内存使用不充分(1/2)