zoukankan      html  css  js  c++  java
  • 深入理解java虚拟机二,内存管理机制

    java 虚拟机自动内存管理。

    java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同区域

    1 程序计数器

    每个线程都有一个独立的计数器,用来指示需要执行的字节码的位置。

    2 虚拟机栈

    虚拟机栈是用来描述java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于储存局部变量表,操作栈,动态链接,方法出口等信息。

    每一个方法被调用直至执行完成的过程,就对应着一个栈帧从虚拟机栈中从入栈到出栈的过程。

    虚拟机栈线程私有,声明周期和线程一样。

    局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,

    在方法运行期间不会改变局部变量表的大小

    当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常

    当虚拟机栈自动扩展时无法申请到足够内存时会抛出OutOfMemoryError异常

    3 本地方法栈

    与虚拟机栈作用类似,不过是作用在本地方法上

    4 java堆

    用途是存放对象实例,在虚拟机启动的时候创建,被所有线程共享。

    根据分代收集算法,分为新生代和老年代。

    java堆可以处于物理上不连续的内存空间中。

    5 方法区

    被所有线程共享。用于存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。

    垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池和对类型的卸载。

    6 运行时常量池

    方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池。

    用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放到方法区的运行时常量池。

    7 直接内存

    本机的直接内存,不受JAVA堆大小限制。

         

  • 相关阅读:
    企业生产环境不同业务linux系统分区方案
    linux 文件 s 权限
    shell中的命令与特殊符号
    Linux数组基础
    shell脚本学习(1)
    文件的压缩与打包
    Linux 磁盘管理基础命令df,du,fdisk,mke2fs
    mkpasswd的使用
    P1080 国王游戏
    P1315 观光公交
  • 原文地址:https://www.cnblogs.com/keeley/p/4041079.html
Copyright © 2011-2022 走看看