JVM
1.jvm的组成部分
-
类加载器:将javac编译的class文件加载到内存中
-
运行时数据区:将内存划分成若干个不同的区域。
-
执行引擎:负责解析命令,提交操作系统执行。
-
本地接口:融合不同的语言为java所用
2.运行时数据区
- 方法区(线程共享):储存已经被虚拟机加载的类信息
- 堆(线程共享):对象实例分配内存,垃圾回收只回收堆中的内容
- 本地方法栈(线程私有):第三方内容
- 虚拟机栈(线程私有):局部变量等信息
- 程序计数器(线程私有):java是多线程,每个线程都有程序计数器,用来选择执行哪行字代码
3.类加载过程
- 加载:反射的过程,把class文件读取到jvm中
- 验证:验证文件格式,访问修饰符,局部变量是否赋值,类型是否匹配等。
- 准备:检查有没有静态变量,有就给静态变量分配内存,赋初始值
- 解析:给final成员赋值
- 初始化:给静态变量赋值
4.堆和栈的区别
堆:内存空间不连续,效率慢,存放对象的实例和数组,更关注存储
栈:内存空间连续,效率高,存放局部变量,更关注方法的执行
5.垃圾回收机制
jvm中有垃圾回收线程,是低优先级的,正常情况下不会执行,虚拟机空闲或者内存不足的时候才会执行。
6.GC
垃圾回收,内存处理的问题程序员容易忽视,java提供gc能自动检测对象是否超过作用域,进行垃圾回收
7.垃圾回收算法
标记清楚
标记整理
复制算法
分代
8.新生代,老年代,永久代
新生代:
1个伊甸园区和2个幸存者区,比例是8:1:1。新创建的队形分配到伊甸园区,经过一次垃圾回收如果仍然存活,就会被移动到幸存者区,在幸存者区中每经历一次垃圾回收年龄就会增长一岁,年龄到达一定程度后,就会被移动到老年代中。(复制算法)
老年代:
主要存放生命周期长的内存对象。
老年代的对象比较稳定,垃圾回收不会频繁进行,在新生代进入老年代导致内存不够时才会触发垃圾回收。(标记清除)
永久代
永久代在方法区中,指的是永久保存区域,存放class和元数据信息,class被加载的时候被放入永久代。java8被元空间替代。
9.JVM的作用
通过编译吧java代码转换成字节码,类加载器把字节码加载到内存中,将其放在方法区内,系统并不能直接执行字节码指令,执行引擎将字节码翻译成系统指令,再由cpu去执行。