JVM运行机制

  1. 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 关键字


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值