Contents
Java启动流程
graph LR
Java_XXX(Java xxx)-->loadProperties(装载配置)-->lookupDLLorSO(寻找dll或so文件)-->initJVM(获得JNIEnv接口)-->findMain(找到main方法)
Java基本结构
flowchart LR
classFile(Class文件)-->classLoadSystem(类加载子系统)-->memorySpace(内存空间)
GC(垃圾收集器)-->memorySpace
subgraph memorySpace
methodSpace(方法区);javaHeap(Java堆);javaStack(Java栈);nativeMethodSpace(本地方法区)
end
threadRegister(线程PC寄存器)-->executeEngine(执行引擎)-->nativeMethodInterface(本地方法接口)-->nativeMethodLib(本地方法库)
threadRegister<-->methodSpace
nativeMethodInterface<-->nativeMethodSpace
PC寄存器
每个线程一个PC寄存器 指向下一条指令 本地方法执行时PC值为undifine
方法区
类的信息,方法信息
Java堆
Java对象保存在Java堆当中 GC的主要工作区
Java栈
线程私有 由一系列帧组成 方法调用时创建帧,压栈
局部变量表
参数+局部变量
操作数栈
Java没有寄存器,参数传递全靠栈
栈上分配
Java内存模型
graph TD
threadExecuteEngine(线程执行引擎)<--assign/user-->threadWorkMemory(线程工作内存)<--read/load/store/write-->mainMemory(主内存)
普通变量, 在一个线程中更新,其他线程并不会立即可见。 若要其他线程立即可见,需要volatile关键字
可见性
可见性
立即可见
保证可见性的方法
volatile synchronized (unlock的时候会写回内存) final
有序性
从一个线程内看, 操作是有序的 多线程情况, 从整体看,操作是无序的。(指令重排或主内存还未同步造成的)
指令重排
读后写,写后读,写后写, 都不可重排 多线程的情况,指令重排会造成问题
解释执行与编译执行
解释执行
读一句,执行一句
编译执行
字节码编译, 然后执行 Java的编译执行是运行时编译(待考证)
发表回复