zoukankan      html  css  js  c++  java
  • JVM学习②

    JVM运行机制


    1、JVM启动流程
    Java启动命令->装载配置寻找jvm.cfg->根据配置寻找JVM.dll(JVM主要实现)->初始化JVM,获得JNIEnv接口
    2、JVM基本结构
    本地方法栈是native
    01、PC寄存器:每个线程有个PC寄存器,随着线程创建,指向下一条命令的地址
    02、执行引擎
    03、方法区:用来保存类的元信息的,通常和永久(Perm)关联在一起
    04、Java堆:和程序开发密切相关,所有线程共享Java堆,对于分带GC,堆也是分带的,GC的主要工作区间{eden s0 s1 tenured}
    05、Java栈:线程私有的,也称之帧栈,由一系列帧组成,帧保存一个方法的局部变量、操作数栈、常量池指针;每个方法的调用创建一个帧,并压栈

    public class StackDemo {
    
    public static int runStatic(int i,long l,float  f,Object o ,byte b){
    return 0;
    }
    
    
    
    
    
    public int runInstance(char c,short s,boolean b){
    return 0;
    }
    
    }

    实例方法第一个槽位是当前对象的引用,传的this

    局部变量表包含  参数和局部变量

    操作数栈:Java没有寄存器,所有参数传递使用操作数栈

    内存泄漏:C++创建对象没有删除,通过栈上分配没法造成内漏泄漏,通过声明

    栈溢出:迭代过程,帧栈满了以后,造成结果

     

    3、Java内存模型

     每一个线程有个工作内存和主存独立

    工作内存存放

    当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;
    第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:
    第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作 每一个操作都是原子的,即执行期间不会被中断 对于普通变量,一个线程中更新的值,不能马上反应在其他变量中 如果需要在其他线程中立即可见,需要使用
    volatile 关键字

    volatile不能代替锁,但一般认为volitile比锁性能好(不是绝对的),是否使用的条件,是语义是否满足应用

    和内存相关的概念

    01、可见性:一个线程修改变量,其他线程可以立即知道

      保证可见性的方法

      volatile

      synchronized(unlock之前,写变量值回主存)

      final(一旦初始化完成,其他线程就可见)

    02、有序性:本线程内操作是有序的

          在线程外观察,操作是无序的(指令重排或主内存同步延时)

      指令重排:线程内串行语义

        指令重排基本原则:

          -程序顺序原则

          -volatile规则

          -锁规则 

          -传递性

    字节码文件执行方式: 

    解释运行:读一句执行一句

    编译运行:(JIT) 将字节码编译成机器码,直接执行机器码;运行时编译;编译后性能有数量级提升    

  • 相关阅读:
    vipw和vigr命令
    linux sudo命令
    linux中切换用户方式su和su -的区别
    ls Common Command-Line Options
    字符串同构问题 字符串操作:数组计数字符个数问题
    聚类算法
    Python实践之(七)逻辑回归(Logistic Regression)
    Gradient Boost Decision Tree(&Treelink)
    天池大数据周冠军分享|附移动推荐算法赛答辩会Top5选手PPT
    【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)
  • 原文地址:https://www.cnblogs.com/developerxiaofeng/p/7655638.html
Copyright © 2011-2022 走看看