- JVM启动流程
java XXX->装载类(路径+版本->jvm.cfg)-》根据配置寻找jvm.dll=>初始化jvm 获得jniEnv接口(findClass)=》main方法运行
2.jvm基本结构
类加载器子系统
方法区、堆、栈、本地方法栈
pc寄存器、执行引擎(数据和指令) 本地方法接口《----本地方法库
pc寄存器
每个线程拥有一个,线程创建时创建,指向下一条 指令地址,执行本地方法时 pc的值为undefined
方法区:
保存装载的类信息,类型的常量池,字段,方法信息,方法字节码
通常和永久区关联在一起。
jdk7 string等常量信息置于堆
java 堆:
应用系统中所以对象保存在堆中,线程共享java堆,Gc 堆是分代 eden s0 s1 tenured
java栈:
线程私有,由一系列帧组成,一个方法的局部变量,操作数栈,常量池指针,每一次方法调用创建帧,并压栈
java栈局部变量表包含参数和局部变量
public class StackDemo{
public static int runStatic(int i,long l ,float f,Objec o , byte b)
}
java 栈 -操作数栈
java没有寄存器,所有参数传递使用操作数栈
public static int add(int a,int b ){
int c=0;
c=a+b;
return c;
}
压栈
弹出int,存放于局部变量2
把局部变量0压栈
局部变量1压栈
弹出2个变量 求和 结果压栈
弹出结果 放于局部变量2
局部变量2压栈
返回
堆上分配 每次需要清理空间
栈上分配 函数调用完成自动清理
小对象 一般几十个bytes 在 没有逃逸的情况下 可以直接分配在栈上
直接分配在栈上
大对象或者逃逸对象无法分配在栈上
-server -Xmx 10m -Xms 10m -XX: +DoEscapeAnalysis -XX:+PrintGC
-server -Xmx10m -Xms 10m -XX -DoEscaspeAnalysis -XX : + PrintGC
栈 堆 方法区交互
Sample实例
Name:测试1
Sample类型信息
printName方法
appMain类型信息
main 方法
局部变量test1
内存模型
每一个线程有一个工作内存和主存独立
工作内存存放主存中变量的值的拷贝
当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作;
每一个操作都是原子的,即执行期间不会被中断;对于普通变量,一个线程中更新的值,不能马上反应在其他变量中
如果需要在其他线程中立即可见,需要使用 volatile 关键字