JVM:Java Virtual Machine即java虚拟机
虚拟机:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
Java虚拟机详解02----JVM内存结构
Java中的内存分配
java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
具体划分为如下5个内存空间:
- 栈:存放局部变量
- 堆:存放所有new出来的东西
- 方法区:被虚拟机加载的类信息、常量、静态常量等
- 程序计数器(和系统相关)
- 本地方法栈
堆内存:
和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享java堆
对分代GC来说,堆也是分代的
gc管理的主要区域
栈内存:
线程私有,生命周期和线程相同
栈由一系列帧组成(因此java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
Java虚拟机详解04----GC算法和种类【重要】
- 引用计数算法(老牌垃圾回收算法,无法处理循环引用,没有被java采纳)
- 根搜索算法(在根搜索算法基础上,主要有下面三种)
- 标记清除算法
- 复制算法(新生代的GC)
- 标记整理算法(老年代的GC)
- 分代收集算法(新生代的gc+老年代的gc)
- 根据对象的存货周期的不同将内存划分为几块。一般是把jva堆分为新生代和老年代:短命对象为新生代,长命对象为老年代
- 少量对象存活,适合复制算法:在新生代中,每次gc都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成gc
- 大量对象存活,适合用标记清理/标记整理:在老年代中,因为对象存活率高、没有额外空间对他进行分配担保,就必须使用标记清理/标记整理算法进行gc
老年代的对象中,有一小部分是因为在新生代回收时,老年代做担保进来的对象;绝大部分对象是因为很多次gc都没有被回收掉进入老年代
Java虚拟机详解----JVM常见问题总结
类加载过程
- 加载:将类的class文件读入内存,并创建java.lang.Class对象
- 链接
- 验证:文件格式、语法语义验证等
- 准备:为static修饰的静态域做默认初始化,并在方法区分配内存空间
- 解析:将符号引用替换为直接引用
- (显示)初始化
以下几种情况中,会执行初始化过程:
- 创建类的实例
- 访问类或接口的静态变量(final static修饰的常量不会对类进行显示初始化。static final修改的变量则会做显示初始化)
- 调用类的静态方法
- 反射
- 初始化类的子类(子类初始化问题:满足主动调用,即父类访问子类中的静态变量、方法,子类才会初始化,,否则仅父类初始化)
- java虚拟器启动时被表明为启动类的类