02Java启动流程与基本结构

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的编译执行是运行时编译(待考证)


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注