zoukankan      html  css  js  c++  java
  • 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常

    2.2运行时数据区域

    运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器

    方法区和堆是线程共享的区域

    虚拟机栈,本地方法栈,程序计数器是数据隔离的数据区

    2.2.,程序计数器,即PC,本质是一块较小的内存区域.可以看做当前线程所执行的字节码的行号指令器

    有了它可以实现字节码指令,分支,循环.跳转.异常处理,线程恢复

    每个线程有一个单独的PC,各个线程之间不互相影响,独立存储

    如果执行的方法是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址

    如果是native方法,即不是java语言实现的方法,计数器为空

    这是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryException情况的区域

    2.2.2java虚拟机栈

    Java虚拟机栈也是线程私有的,它的生命周期与线程相同

    它描述的是java方法执行的内存模型:每个方法执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,放大出口灯信息.,每个方法从调用到执行完成的过程,就对应着一个栈帧入栈到操作的过程

    局部变量表存放了编译器可知的各种基本数据类型(Boolean,byte,char等),对象引用,即reference类型(可能指向一个对象其实地址的引用指针,也可能是指向一个代表对象的句柄或者其他和此对象相关的位置),和returnAddress类型(指向了一个字节码的地址)

    StackOverflowError,发生在线程请求的栈深度大于虚拟机所允许的深度的时候

    OutOfMemoryError,无法在扩展内存的时候发生

    本地方法栈:

    跟虚拟机栈的作用一样,不过虚拟机栈运行java方法,而本地方法栈则运行Native服务

    本地方法栈中使用的语言,数据结构等没有强制规定,有具体的虚拟机去实现它

    Java堆

    Java 堆是所有线程共享的一块内存区域,他的唯一作用就是存放实例化的对象,所以他是垃圾收集器的主要作用区域,

    Java可以细分为新生代和老年代

    更细致的分法”

    Eden空间

    From survivor空间

    To survivor空间

    从内存分配的角度还可以分为多个线程私有的分配缓冲区

    无论怎么划分都和存放内容无关,存储的都是对象实例,进一步划分的目的是为了更好的回收内存

  • 相关阅读:
    【SPOJ】6779 Can you answer these queries VII
    【SPOJ】1557 Can you answer these queries II
    【SPOJ】2916 Can you answer these queries V
    【CodeForces】86D Powerful array
    【SPOJ】1043 Can you answer these queries I
    【HDU】3727 Jewel
    【HDU】3915 Game
    【SPOJ】1043 Can you answer these queries III
    【SPOJ】2713 Can you answer these queries IV
    成为一名更好的软件工程师的简单方法
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9954972.html
Copyright © 2011-2022 走看看