目录
1.1 对象的内存布局?Java 虚拟机组成部分,哪些是线程私有?
3.1 什么是 Java 内存模型,以及Java内存模型的作用?
一、内存管理
1.1 对象的内存布局?Java 虚拟机组成部分,哪些是线程私有?
线程私有的程序计数器、虚拟机栈、本地方法栈,线程共享的堆和方法区。
1、程序计数器:指向当前运行的程序;
2、虚拟机栈:存放局部变量表、方法栈帧等;
3、本地方法栈:存放本地方法;
4、堆:用于存放对象的实例;
5、方法区:虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等;(运行时常量池:存放编译器生成的字面量和符号引用)。
1.2 如何判断对象是否存活?
1、引用计数法:每个对象拥有一个引用计数器,当对象被引用的时候,计数器+1,引用释放,计数器-1,存在循环引用的风险;
2、可达性分析算法:以 GC Roots 为起始点,向下进行搜索,搜索走过的路径称为引用链,当该对象不存在到达 GC Roots 时,表示该对象可以被回收。
1.3 对象的四个引用
1、强引用:new 指令生成的对象,引用存在,不会被垃圾收集器回收。
2、软引用:有用但非必需的对象,在内存溢出之前进行回收。
3、弱引用:非必需的对象,只能生存到下一次垃圾回收之前。
4、虚引用:该对象在垃圾回收的时候收到一个系统通知。
1.4 垃圾收集算法有哪几个?
1、标记清除算法;
2、复制算法;
3、标记整理算法;
4、分代回收算法:新生代内存分为:Eden、Survivor_from、Survivor_to,老年代为:Old;
新对象在 Eden 分配内存,对象有年龄,每次Eden区内存不够,执行一次新生代GC,对象的年龄增加一岁;新生代GC发生时,JVM会将 Eden 和 Survivor_from 两块内存中存活的对象,复制到 Survivor_to 内存中,然后将 Eden 和 Survivor_from 内存清空。
年龄达到16的送入老年代和大对象会直接进入老年代。
1.4 G1垃圾收集器和GC日志
收集器 | 新/老年代 | 算法 | 目标 | 适用场景 |
---|---|---|---|---|
Serial | 新生代 | 复制算法 | 响应速度优先 | |
Serial Old | 老年代 | 标记-整理 | 响应速度优先 | |
ParNew | 新生代 | 复制算法 | 响应速度优先 | |
Parallel Scavenge | 新生代 | 复制算法 | 吞吐量优先 | |
Parallel Old | 老年代 | 标记-整理 | 吞吐量优先 | |
CMS | 老年代 | 标记-清除 | 响应速度优先 | |
G1 | both | 标记-整理+复制算法 | 响应速度优先 |
1.5 虚拟机性能监控和可视化工具
名称 | 作用 |
jps | JVM Process Status Tool,显示系统中所有的Hotspot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 |
jinfo | Configuration info for java,显示虚拟机配置信息 |
jmap | Memory Map for java,生成虚拟机的内存转储快照(heapdump文件) |
jhat | JVM Heapdump Browser,用于分析heapdump文件,会建立一个HTTP/HTML服务器,用户可以在浏览器上查看分析结果 |
jstack | Stack Trace for java,显示虚拟机的线程快照 |
JConsole | Jconsole是JDK自带的监控工具,用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,提供强大的可视化界面。 |
VisualVM | VisualVM是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。 |
二、虚拟机执行子系统
2.1 class 无关性基石
2.2 类加载器
类加载机制:将后缀为.class文件加载到内存,经过加载、链接、初始化生成二进制可执行文件。
加载:将字节码读取到JVM中,并映射为JVM认可的数据结构。
链接:1)验证:检验是否符合JVM虚拟机规范;
2)准备:初始化静态变量为零值;
3)解析:将间接引用替换为直接引用。
初始化:执行类中定义的Java程序代码, 静态变量初始化。
2.3 双亲委派是什么?有哪些?为什么要双亲委派?
|- 类加载器收到类加载请求的时候,将请求委派给交给父类加载器进行加载,所有的加载请求都会委派给顶层的系统类加载器,当父类加载器无法加载时,子加载器再尝试加载。
|- 启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器;
|- 为了系统安全,对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。
2.4 new 对象的创建过程?
1、常量池中查找是否存在;
2、类加载(初始化静态变量为零值,并初始化);
3、内存分配;
4、初始化非静态变量为零值;
5、设置对象头;
6、执行非静态变量的Java程序代码,即初始化。
三、Java 内存模型
3.1 什么是 Java 内存模型,以及Java内存模型的作用?
Java 内存模型定义各个变量的访问规则,由 violate、final、sychronized 关键字实现原子性、可见性、有序性,以及 happen before 原则组成,happen before 原则:程序顺序规则、管程规则、violate规则、线程start()规则、线程join()规则、传递性规则。
3.2 Happen Before 原则
1、程序顺序规则:
2、管程规则:
3、violate规则:
4、线程start()规则:
5、线程join()规则:
6、传递性规则:
3.3 线程安全
1、互斥同步(悲观锁):
2、非阻塞同步(乐观锁):
3.4 锁优化(未详细介绍)
1、自旋锁:
2、轻量级锁:
3、所偏向:
4、锁消除:
5、锁粗化: