JVM学习②

JVM运行机制


1、JVM启动流程
Java启动命令->装载配置寻找jvm.cfg->根据配置寻找JVM.dll(JVM主要实现)->初始化JVM,获得JNIEnv接口
2、JVM基本结构
本地方法栈是native
01、PC寄存器:每个线程有个PC寄存器,随着线程创建,指向下一条命令的地址
02、执行引擎
03、方法区:用来保存类的元信息的,通常和永久(Perm)关联在一起
04、Java堆:和程序开发密切相关,所有线程共享Java堆,对于分带GC,堆也是分带的,GC的主要工作区间{eden s0 s1 tenured}
05、Java栈:线程私有的,也称之帧栈,由一系列帧组成,帧保存一个方法的局部变量、操作数栈、常量池指针;每个方法的调用创建一个帧,并压栈

public class StackDemo {

public static int runStatic(int i,long l,float  f,Object o ,byte b){
return 0;
}





public int runInstance(char c,short s,boolean b){
return 0;
}

}

实例方法第一个槽位是当前对象的引用,传的this

局部变量表包含  参数和局部变量

操作数栈:Java没有寄存器,所有参数传递使用操作数栈

内存泄漏:C++创建对象没有删除,通过栈上分配没法造成内漏泄漏,通过声明

栈溢出:迭代过程,帧栈满了以后,造成结果

 

3、Java内存模型

 每一个线程有个工作内存和主存独立

工作内存存放

当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;
第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:
第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作 每一个操作都是原子的,即执行期间不会被中断 对于普通变量,一个线程中更新的值,不能马上反应在其他变量中 如果需要在其他线程中立即可见,需要使用
volatile 关键字

volatile不能代替锁,但一般认为volitile比锁性能好(不是绝对的),是否使用的条件,是语义是否满足应用

和内存相关的概念

01、可见性:一个线程修改变量,其他线程可以立即知道

  保证可见性的方法

  volatile

  synchronized(unlock之前,写变量值回主存)

  final(一旦初始化完成,其他线程就可见)

02、有序性:本线程内操作是有序的

      在线程外观察,操作是无序的(指令重排或主内存同步延时)

  指令重排:线程内串行语义

    指令重排基本原则:

      -程序顺序原则

      -volatile规则

      -锁规则 

      -传递性

字节码文件执行方式: 

解释运行:读一句执行一句

编译运行:(JIT) 将字节码编译成机器码,直接执行机器码;运行时编译;编译后性能有数量级提升    

原文地址:https://www.cnblogs.com/developerxiaofeng/p/7655638.html