一、经过java 命令 启动JVMjava
二、装置配置(根据当前路径及系统版本寻找jvm.cfg)算法
三、根据配置找jvm.dll多线程
四、使用jvm.dll初始化JVMjvm
五、找到main,并执行函数
一、每一个线程都有一个PC寄存器性能
二、在线程建立的时建立spa
三、指向下一条指令的地址线程
四、执行本地方法,PC寄存器的值是未定义的指针
一、保存类的信息对象
二、一般与永久区关联在一块儿
一、全部的对象 都存在堆
二、因此线程都是共享java堆
三、堆的结构与gc算法是有关系的
四、gc的主要工做区
一、线程私有
二、栈由一些列帧组成
三、帧保存一个方法的局部变量、操做数栈、常量池指针
四、每一次方法调用,都会建立一个新的 帧,并压入栈中
一、小对象(通常几十个bytes),在没有逃逸的状况下,能够直接分配在栈上
二、直接分配在栈上,能够自动回收,减轻GC压力
三、大对象或者逃逸对象没法栈上分配
怎么可让递归函数 调用的次数多一些,应该怎么作?
首先了解到线程在调用每一个方法的时候,都会建立相应的栈,在退出方法的时候移出栈桢,而且栈是私用的,也须要占用空间,因此让一个程序的函数调用层次变的更深
减小栈贞的空间很必要。或者增大线程的线的大小。
经过volatile增长调用层次深度。线程会对一个没有volatile的变量进行临时存储,这就致使线程栈的空间增大,若是对一个变量增长volatile修饰,能够适当增长深度;
除此以外能够减少局部变量表,好比 少用double,long,减小参数个数,局部变量在使用的时候,注意做用域
一、每一个线程都有本身的工做内存 ,与主存独立
volatile 不能代替锁,通常状况比锁效率好
一、volatile 的使用
二、synchronized 使用
三、final(初始化以后,其余线程就能够看到)
一、本线程中,操做是有序的
二、多线程是无序的,操做是无序的(指令重拍或主存同步延迟)
三、加上synchronized ,能够保证重拍
程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写,先发生于读
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C 那么A必然先于C
线程的start方法先于它的每个动做
线程的全部操做先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
编译运行 效率高于 解释运行
一、解释运行
解释执行以解释方式运行字节码;解释执行的意思是:读一句执行一句
二、编译运行(JIT)
将字节码编译成机器码;直接执行机器码;运行时编译;编译后性能有数量级的提高