JVM体系结构 1.运行时数据区域 1.1程序计数器 1.2虚拟机栈 1.3本地方法栈 1.4堆(新生代、老年代、永久代) 1.5方法区 1.6运行时常量池 1.7直接内存 2.判断一个对象是否可被回收 2.1引用计数算法 2.2可达性分析算法 2.3强引用、弱引用、软引用、虚引用 2.4方法区的回收 2.5finalize() 3垃圾手机算法 3.1标记-清除 3.2标记-整理 3.3复制回收 4垃圾收集器 4.1Serial 4.2ParNew 4.3Parallel Scavenge 4.4Serial Old 4.5Parallel Old 4.6CMS 4.7G1 4.8比较 5.内存分配与回收策略 5.1什么时候进行Minor GC、Full GC 5.2内存分配策略(对象优先在Eden分配、大对象直接进入老年代、长期存活的对象进入老年代、动态对象年龄判定、空间分配担保) 5.3Full GC的触发条件(调用System.gc()、老年代空间不足、空间分配担保失败、JDK1.7及以前的永久代空间不足、Concurrent Mode Failure) 6类加载机制 6.1类的生命周期 6.2类初始化时机(主动引用、被动引用) 6.3类加载过程(加载/验证/准备/解析/初始化) 6.4类加载器(类与类加载器、类加载分类、双亲委派模型) 7 Student s = new Student();在内存中做了哪些事情 8Java虚拟机工具 9了解JVM调优,基本思路是什么 10JVM线程死锁的原因 11什么是内存泄漏,用什么工具可以查出内存泄漏
核心知识
JVM基本结构
- 类加载器
- 执行引擎
- 运行时数据区
- 本地接口
Class Files -> ClassLoader -> 运行时数据区 -> 执行引擎、本地库接口 -> 本地方法库
JVM体系结构
虚拟机是物理机器的软件实现。Java的开发遵循write once run anywhere(一次编写到处运行)理念。它运行在VM(虚拟机)上。编译器将Java文件编译成Java.class文件,将.class文件输入到JVM中,加载并执行该类文件。下图是JVM的体系结构。
JVM各个模块
1.运行时数据区:经过编译生成的字节码(class文件),由class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据存储在一块内存区域。这块内存区域就是运行时区域。
2.程序计数器:用于记录当前线程的正在执行的字节码指令位置。由于虚拟机的多线程是切换线程并分配CPU执行时间的方式实现的,不同线程的执行位置都需要记录下来,因此程序计数器是线程私有的。
3.虚拟机栈:虚拟机栈是Java方法执行的内存结构,虚拟机会在每个Java方法执行时创建一个”栈帧“,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。当方法执行完毕时,该栈帧会从虚拟机栈中出栈。其中局部变量表包含基本数据类型和对象引用。
在Java虚拟机规范中,对这个区域规定了两种异常状态:如果线程请求的栈的深度大于虚拟机允许的深度,将抛出StackOverFlowError异常(栈溢出),如果虚拟机栈可以动态扩展(现在大部分Java虚拟机都可以动态扩展,只不过Java虚拟机规范中中允许固定长度的Java虚拟机栈),如果扩展时无法申请到足够的内存空间,就会抛出OutOfmMemoryError异常(没有足够的内存)
4.本地方法栈:类似Java方法的执行有虚拟机栈,本地方法的执行则对应有本地方法栈
5.方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。线程共享(看存储的数据就知道了)
6.Java堆(Heap):堆的主要作用是存在程序运行过程中创建的对象实例,因为要存在的对象实例有可能会极多,因此也是虚拟机内存管理中最大的一块。并且由于硬件条件有限,所以需要不断回收已”无用“的实例对象来腾出空间给新生成的实例对象;因此Java的垃圾回收主要是针对堆进行回收的(还有方法区的常量池),Java堆很多时候也被称为GC堆(Garbage Collected Heap)
7.类加载机制(Class Loader):类加载子系统是根据一个类的全限顶名加载该类的二进制流到内存中,在JVM中将形成一份描述Class结构的元信息对象(方法区),通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等。Java允许用户借由这个class相关的元信息对象间接Class对象的功能。
JVM是如何工作的?
如上面的体系结构图所示,JVM分为三个主要的子系统:
1.类加载器子系统
2.运行时数据区
3.执行引擎
1.类加载器子系统
Java的动态类加载功能是由类加载器子系统。它负责加载、链接,并且在运行时首次引用类的时候初始化类,而不是在编译期间。
1.1 加载