p1-26略
p27 类加载器及类加载过程
p28 类加载过程一:loading
p29 类加载过程二:linking
p30 类加载过程三:初始化
代码:
编译后class
从字节码指令可以看出number是先赋值20.再赋值10
p31 几种类加载器
引导类加载器不是用java写的,用c++写的
系统类加载器
扩展类加载器
public class ClassLoadTest {
public static void main(String[] args) {
//系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
//上层扩展类加载器
ClassLoader extendClassLoader = systemClassLoader.getParent();
System.out.println(extendClassLoader);//sun.misc.Launcher$ExtClassLoader@1b6d3586
//上层启动类加载器
ClassLoader bootstrapClassLoader = extendClassLoader.getParent();
System.out.println(bootstrapClassLoader);//null
// 自定义使用系统类加载器
ClassLoader systemClassLoader1 = ClassLoadTest.class.getClassLoader();
System.out.println(systemClassLoader1);//sun.misc.Launcher$AppClassLoader@18b4aac2
//系统类使用启动类加载器
ClassLoader bootstrapClassLoader1 = String.class.getClassLoader();
System.out.println(bootstrapClassLoader1);//null
}
}
p32 引导类 扩展类 系统类加载器的使用及演示
p33用户自定义类加载器
p34 ClassLoader的常用方法及获取方法
p35 双亲委派机制
比如说自定义一个java.lang.string类,但是会先交给启动类加载器去加载,启动类加载器负责加载的包下面已经有了这个类,所以我们写的sttring类就失效了
p36双亲委派机制的优势
p37 沙箱安全机制
p38类的主动使用与被动使用
p39 运行时数据区内部结构
p40 jvm线程说明
p41 pc寄存器概述
p42 pc寄存器使用举例
p44 虚拟机栈的主要特点
p45 虚拟机异常与如何设置栈大小
p46 栈的存储结构和运行原理
p47栈帧的内部结构
p48局部变量表
p49 字节码中方法内部结构的剖析
p50 变量槽slot
p51静态变量与局部变量对比
p52操作数栈
p53涉及操作数栈的字节码指令执行分析
略
p54 栈顶缓存技术
p55 动态链接的理解与常量池的使用
p56 方法的绑定机制
p57 4种方法调用指令区分非虚方法与虚方法
package java2;
/**
* 解析调用中非虚方法、虚方法的测试
*
* invokestatic指令和invokespecial指令调用的方法称为非虚方法
* @author shkstart
* @create 2020 下午 12:07
*/
class Father {
public Father() {
System.out.println("father的构造器");
}
public static void showStatic(String str) {
System.out.println("father " + str);
}
public final void showFinal() {
System.out.println("father show final");
}
public void showCommon() {
System.out.println("father 普通方法");
}
}
public class Son extends Father {
public Son() {
//invokespecial
super();
}
public Son(int age) {
//invokespecial
this();
}
//不是重写的父类的静态方法,因为静态方法不能被重写!
public static void showStatic(String str) {
System.out.println("son " + str);
}
private void showPrivate(String str) {
System.out.println("son private" + str);
}
public void show() {
//invokestatic
showStatic("atguigu.com");
//invokestatic
super.showStatic("good!");
//invokespecial
showPrivate("hello!");
//invokespecial
super.showCommon();
//invokevirtual
showFinal();//因为此方法声明有final,不能被子类重写,所以也认为此方法是非虚方法。
//虚方法如下:
//invokevirtual
showCommon();
info();
MethodInterface in = null;
//invokeinterface
in.methodA();
}
public void info(){
}
public void display(Father f){
f.showCommon();
}
public static void main(String[] args) {
Son so = new Son();
so.show();
}
}
interface MethodInterface{
void methodA();
}
p58 invokedynamic指令的使用
p59 方法重写的本质
p60 方法返回地址的说明
p62 虚拟机栈的5道面试题
略
p63 本地方法接口的理解
p64 本地方法栈的理解
p66 堆空间概述
p67 堆空间关于对象创建和GC的概述
p68 堆细分内存结构
p69 堆空间大小设置
p70 OOM的说明与举例
略
p71 新生代与老年代相关参数的设置
p72 图解对象分配的一般过程
p73 对象分配的特殊情况
p74 代码举例与jvisualVM演示对象的分配过程
p75 常用工具概述与jprofiler演示
p76 minorGC MajorGC与fullGC的对比
p77 GC举例与日志分析
略
p78 体会堆空间分代的思想
p79 总结内存分配策略
p80 堆空间为每个线程分配的TLAB
查询是否开启了tlab
p81小结堆空间常用参数设置
p82 通过逃逸分析看堆空间的对象分配策略
没有逃逸:
p83 代码优化之栈上分配
p84 代码优化之同步省略
p85 代码优化之标量替换
未开启前会在堆内进行垃圾回收,开启后直接存储在栈中,随着出栈就消失,不存在垃圾回收
p86代码优化及堆的小结
p87 方法区概述 栈堆方法区间的交互关系
p88 方法区的基本理解
p 89Hotspot中方法区的演进
p90 设置方法区大小的参数
p91 oom metaspace举例
p92方法区的内部结构1
p93 方法区内部结构2
p94 class文件中常量池的理解
p95 运行时常量池的理解
p96举例方法区的使用
p97 方法区在jdk6 7 8中的演进细节
p098 stringtable为什么要调整位置
p99 如何证明静态变量存在哪
p100 方法区的垃圾回收