zoukankan      html  css  js  c++  java
  • JVM 内存模型

    内存模型如下图所示:

    首先要说一下JVM内存空间分为五部分,分别是:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器

    1. 方法区

    方法区主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小是可以动态扩展的,

    2. 堆

    堆主要存放的是数组、类的实例对象、字符串常量池等。

    3. Java虚拟机栈

    Java虚拟机栈是描述JAVA方法运行过程的内存模型,Java虚拟机栈会为每一个即将执行的方法创建一个叫做 栈帧 的区域,该区域用来存储该方法运行时需要的一些信息,包括:局部变量表、操作数栈、动态链接、方法返回地址等。

    比如我们方法执行过程中需要创建变量时,就会将局部变量插入到局部变量表中,局部变量的运算、传递等在操作数栈中进行,当方法执行结束后,这个方法对应的栈帧将出栈,并释放内存空间。

    栈中会发生的两种异常,StackOverFlowError 和 OutOfMemoryError

    StackOverFlowError 表示当前线程申请的栈超过了事先定好的栈的最大深度,但内存空间可能还有很多。

    OutOfMemoryError 是指当线程申请栈时发现栈已经满了,而且内存也全都用光了。

    4. 本地方法栈

    本地方法栈结构上和Java虚拟机栈一样,只不过Java虚拟机栈是运行Java方法的区域,而本地方法栈是运行本地方法的内存模型。

    运行本地方法时也会创建栈帧,同样栈帧里也有局部变量表、操作数栈、动态链接和方法返回地址等,在本地方法执行结束后栈帧也会出栈并释放内存资源,也会发生OutOfMemoryError。

    5. 程序计数器

    程序计数器是一个比较小的内存空间,用来记录当前线程正在执行的那一条字节码指令的地址。

    如果当前线程正在执行的是本地方法,那么此时程序计数器为空。

    程序计数器有两个作用,

    1. 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,比如我们常见的顺序、循环、选择、异常处理等。
    2. 在多线程的情况下,程序计数器用来记录当前线程执行的位置,当线程切换回来的时候仍然可以知道该线程上次执行到了哪里。

    而且程序计数器是唯一 一个不会出现OutOfMeroryError的内存区域。

    方法区和堆都是线程共享的,在JVM启动时创建,在JVM停止时销毁,而Java虚拟机栈、本地方法栈、程序计数器是线程私有的,随线程的创建而创建,随线程的结束而死亡。

  • 相关阅读:
    二分搜索
    中文分词 (机械传统方法 )正向最大匹配
    推荐引擎概述(转自IBM worker)
    linux OS 多线程学习
    FastReport.Net传递报表参数
    MSSQL 2008 镜像的客户端数据库连接字符串
    FastReport.Net自动行高
    ReSharper 8.0开发版 ReSharper 8.0 Early Access
    客户端FastReport.Net默认界面语言
    ReSharper 7.0 正式版发布
  • 原文地址:https://www.cnblogs.com/john1015/p/13935824.html
Copyright © 2011-2022 走看看