自变量:字符串,final修饰
符号引用:类,接口,字段,方法名称描述
直接引用:类,接口,字段,方法名称在JVM中落地
JVM有什么用?作为桥梁使Java程序在不同的环境里运行。
将源码翻译成字节码文件(16进制,并不是2进制;开头0xCAFEBABE)
装载 > 链接 (1.验证 (判断格式准确性) > 初始化 > 使用
2.准备 (分配内存,准备阶段完成,默认值为0)
3.判断 ())
类加载机制(ClassFile >> 字节流 >> 类加载器)
双亲委派:类加载时,不论自己是否加载,都会先去找自己的父类,如父类存在则先加载父类。
打破双亲委派的方法:1.复写 2.SPI 3.OSGI
运行时数据区
线程共享
方法区(非堆)Method Area:类信息,静态变量,常量,即时编译器编译后的代码(生命周期跟进程所绑定,如果不够用了,则会抛出OutOfMemoryError内存溢出异常)
堆Heap:代表类的java.lang.Class对象,在虚拟机启动时创建,被所有线程所共享。主要存分对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。
1.内存最大,线程共享
2.Java的实例对象都在堆上分配
3.也会报OutOfMemoryError异常
线程私有
Java虚拟机栈:
线程私有,生命周期与线程一致。描述的是Java方法执行的内存模型。
每调用一个方法就在栈中压入一个栈帧,方法完成就会讲栈帧弹出。
栈帧(栈执行的最小单位invoke)
无限压入栈就会报StackOverflowError异常
程序计数器(保证程序按顺序执行):
内存小,线程私有。每个线程都有自己的PC寄存器,在线程启动时创建,PC寄存器的内容总是指向下一条将被执行指令的地址。
如果执行Java方法,则记录线程所执行到的位置
如果执行native方法,则记录为空
本地方法栈(native):
区别于Java虚拟机栈的是,Java虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则是为虚拟机使用到Native方法服务。也会有StackOverflowErroe和OutOfMemoryError异常。
Java对象的结构
面试题:1.什么是符号引用转变成直接引用?
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。
直接引用则是在堆中开辟了内存空间
2.接口隔离和单一职责?
一个针对接口,一个针对类,一个接口/类只做一件事