zoukankan      html  css  js  c++  java
  • JVM 虚拟机 内存说明

    Java虚拟机所管理的内存图:

     

    1程序计数器:

    该模块作用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次获得CPU时继续执行。程序里的每个线程程序计数器相互独立,互不影响,该内存区也称“线程私有”内存。

    2、java虚拟机栈:

             与程序计数器一样,java虚拟机栈也是“线程私有”,’每个方法执行的时候进入虚拟机栈,会创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息,每一个方法从调用到执行完成,对应着每一个栈帧在虚拟机栈中从入栈到出栈的过程。

             其中局部变量表包括java基本数据类型以及对象引用类型(reference)、returnAddress类型,该区域在代码编译时即确定占用内存大小,不会在执行方法中改变。

             在虚拟机规范中,该区会产生两种异常,一种是线程请求的栈深度大于虚拟机所允许的深度会抛出StackOverFlowError 异常;当虚拟机动态拓展java虚拟机栈没有足够的内存时,会产生OutOfMemoryError异常

    3、本地方法栈

             本地方法栈跟java虚拟机栈类似,不过java虚拟机栈是为java方法(java字节码)服务,本地方法栈是为Native方法服务,本地方法栈也会抛出StackOverFlowError以及OutOfMemoryError异常。

    4、Java堆

             Java堆是java虚拟机占用内存最大一块,所有对象共享该内存区。该区域存放对象,所有实例对象以及数组都在该区域分配内存进行实例化(随着JTI编译器的发展与逃逸分析技术的成熟,该说法不再绝对)

             Java堆是垃圾回收的主要区域,该区域实例化时可用是连续的内存区域或者分开的区域,只要逻辑上是连续的即可,如果该区域实例化的时候分配不到内存或成熟OutOfMemoryError异常。

    5、方法区

             方法区和java堆一样都是共享区域,用于存储虚拟机已经加载的类信息、常量、静态变量以及即时编译器编译的代码数据,虽然java虚拟机规范描述该区为java堆的逻辑部分,但是该区有一个别名“非堆”,应该区分为方法区。

    6、运行常量池

             运行时常量池是方法区的一部分。Class文件中除了有版本、字段、方法、描述等信息,还有一项常量池,用于存储编译期生成的各种字面量和符号引用。

    7、直接内存

  • 相关阅读:
    将Excel文件转换为Html
    怎样录制屏幕并将结果保存为Gif
    Spire.Pdf 的各种操作总结
    在C#中使用Spire.doc对word的操作总结
    使用Spire.Barcode程序库生成二维码
    【BZOJ1304】[CQOI2009]叶子的染色(动态规划)
    【BZOJ1303】[CQOI2009]中位数图(模拟)
    【BZOJ1297】[SCOI2009]迷路(矩阵快速幂)
    【BZOJ1296】[SCOI2009]粉刷匠(动态规划)
    【BZOJ1295】[SCOI2009]最长距离(最短路)
  • 原文地址:https://www.cnblogs.com/huxdiy/p/5645399.html
Copyright © 2011-2022 走看看