• jvm 01-java内存模型


    java程序执行流程

    • 所有的java程序代码必须保存在*.java的文件之中(源代码)
    • 然后使用javac.exe命令将其编译为*.class文件
    • 最后利用java.exe命令在JVM进程之中解释此程序
    • 当JVM将所需要的*.class文件加载到JVM进程之中需要一个类加载器(ClassLoader)
    • 类加载器可以随意指定程序*.class文件的所在路径
    • 考虑到操作系统之间移植性的问题,所有程序都要运行在JVM上
    • 在java里面可以使用native实现本地C函数的调用

    java内存管理

    • 栈是运行时的单位,里面存储的信息都是跟当前线程相关的信息
    • 堆是存储的单位,只是保存对象信息

    java运行时数据区

    • java所有的程序运行都在运行时数据区之中
    • 在整个的运行时数据区之中,分为如下几个内存空间
      • 堆内存:保存所有引用数据类型的真实信息
      • 栈内存:基本类型、运算、指向堆内存的指针
      • 方法区:所有定义的方法的信息都保存在方法区之中,此区属于共享区
      • 程序计数器:是一个非常小的内存空间,作用是当前线程所执行的字节码的行号指示器
      • 本地方法栈:每一次执行递归的方法处理的时候实际上都会将上一个方法入栈

    java虚拟机栈(Java Virtual Machine Stack)

    • 栈内存是线程私有的,其生命周期和线程相同
    • 虚拟机栈描述的是java方法执行的内存模型
    • 执行一个方法是会产生一个栈帧,随后将其保存到栈的顶部(后进先出)
    • 方法执行完毕后会自动将此栈帧进行出栈
    • 顶部的栈帧就表示当前方法
    • 如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常
    • 如果虚拟机的实现中允许虚拟机栈动态扩展,但内存不足以扩展时,会抛出OutOfMemoryError异常

    java虚拟机栈--栈帧(Stack Frame)

    • java虚拟机栈会存放的是多个栈帧,主要组成部分为
    • 局部变量表(Local Variables):
    • 方法的局部变量或形参,其变量槽为最小单位,只允许保存32位长度的变量
    • 如果超过32位,则会开辟两个连续的solt(64位长度,long和double)
    • 操作数帧(Openrand Stack):
    • 表达式计算在栈中完成
    • 指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant pool):
    • 引用其他类的常量或者使用String池中的字符串
    • 方法返回地址(Return Address):
    • 方法执行完后需要返回调用此方法的位置,所以需要在栈帧中保存方法返回地址
  • 相关阅读:
    快速实现进度条
    Cristi Potlog's Chart Control for .NET
    摩托罗拉投资Android外来往戏开辟商Moblyng
    展讯通讯四季度净利润3000万美元同比增长20倍
    罗仕证券上调空中网评级至"买入"
    政协委员郭为:立异体系体例要以运用为先
    软通动力第四季度净盈余390万美元
    华盛顿邮报:iPad 2将扩展抢先职位
    TwitPic借绯闻男星营销 每个单词赚1.6美元
    苹果向2周内新购iPad一代用户退款100美元
  • 原文地址:https://www.cnblogs.com/liangjingfu/p/9922728.html
Copyright © 2020-2023  润新知