1.jvm 启动流程
2.jvm基本结构
pc寄存器: -每个线程拥有一个pc寄存器 -在线程创建时创建 -指向下一条指令的地址 -执行本地方法时,Pc的值为undefined (未定义的)
方法区: 1.保存装载的类信息 -类型的常量 -字段,方法信息 -方法字节码 (jdk6:String等常量反正方法区 jdk7:已经将String等常量移到了) 2.通常和永久区关联在一起
java堆: -和程序开发密切相关 -应用系统对象都保存在java堆中 -对分代的GC来说,堆也是分代的 -GC的主要工作区间 复制算法
java栈: -线程私有 -栈由一系列帧组成(因此java栈也叫作帧栈) -帧保存一个方法的局部变量,操作数据,常量池指针 -每一次方法调用创建一个帧,并压栈 –局部变量表包含参数和局部变量
– 函数调用组成帧栈
public static inttest(int a,int b, int c){ returntest(a,b,c); }
–Java没有寄存器,所有参数传递使用操作数栈
– 栈上分配: 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上 直接分配在栈上,可以自动回收,减轻GC压力 大对象或者逃逸对象无法栈上分配
-栈、堆、方法区交互
public class Personnel { private String name;
public Personnel(String name) { = name; }
public String getName() { return name; }
public void setName(String name) { = name; }
public void sysoName() { System.out.println(name); }
}
public class TestMain {
public static void main(String[] args) { Personnel a = new Personnel("testa"); Personnel b = new Personnel("testb");
a.sysoName(); b.sysoName(); } }
3.内存模型 -每一个线程有一个工作内存和主存独立 -工作内存存放主存中变量的值的拷贝
当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作 每一个操作都是原子的,即执行期间不会被中断 对于普通变量,一个线程中更新的值,不能马上反应在其他变量中
如果需要在其他线程中立即可见,需要使用 volatile 关键字
基本结构- 可见性:一个线程修改了变量,其他线程可以立即知道 保证可见性的方法 -volatile -synchronized(解锁之前,写变量值回主存) -final 一旦初始化完成 其他线程可见
4编译和解释运行的概念 解释运行: -解释执行以解释方式运行字节码 -意思是:读一句执行一句
编译运行: -将字节码编码成机器码 -直接执行机器码 -运行时编码 -编译后性能有数量级的提升
|