黑马程序员技术交流社区
标题:
深入Java虚拟机-JVM运行机制
[打印本页]
作者:
沉湎码海
时间:
2017-2-17 22:18
标题:
深入Java虚拟机-JVM运行机制
深入Java虚拟机-JVM运行机制-讲02
1.Java栈-操作数栈
-Java没有寄存器,所有参数传递使用操作数栈。
2.Java栈-栈上分配 (这是JVM的一种优化机制)
-小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上。
-直接分配在栈上,可以自动回收,减少GC压力(因为随着方法的结束,会有弹栈动作,所以栈上的东西,随着方法的结束,而消失)
-大对象或者逃逸对象无法在栈上分配。
3.方法本身是存储到方法区的。
4.内存模型:
- 每一个线程有一个工作内存和主内存
5.可见性
-一个线程修改了变量,其他线程可以立即知道。
-保证可见性的方法:
- volatile
-synchroized (unlock之前,写变量值回主存)
-final (一旦初始化完成,其他线程就可见)
6.指令重排
-线程内串行语义
编译器不考虑多线程之间的语义。
-指令重排 -破坏线程间的有序性
7.保证有序性的方法-加同步 synchronized
8.指令重排的基本原则:
. 程序顺序原则 : 一个线程内保证语义的串行性。
. volatile规则 : volatile变量的写,先发生于读
. 锁规则 : 解锁必然发生在随后的加锁前
. 传递性 : A优先于B,B优先于C,那么A必然优先于C
. 线程的start 方法先于它的每一个动作。
.线程的所有操作先于线程的终结(Thread.join())
. 线程的中断(interrupt())先于被中断线程的代码
.对象的构造函数执行结束先于 finalize()方法
9.字节码执行的两种方式:
方式一 : 解释执行
- 解释执行以解释方式运行字节码
-解释执行的意思是: 读一句执行一句。
方式二 : 编译执行(JIT)
- 将字节码编译成机器码
-直接执行机器码
-运行时编译
-编译后能有数量级的提升。
注意: 编译执行的效率会是解释执行效率的10倍以上。
10.
先找config 文件,然后由config文件找dll,在这个dll里面会执行一些接口去初始化整个虚拟机,找到main函数,开始执行。
11.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2