Java核心01-JVM内存区域

JVM内存区域

  1. 程序计数器
    1. 程序计数器是一块较小的内存空间,可看作是当前线程所执行的字节码的行号指示器线程私有的,它的生命周期与线程生命周期一致;
    2. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。如:顺序执行、选择、循环、异常处理等。
    3. 在多线程下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来时,能够找到该线程上次运行到哪里。
  2. Java 虚拟机栈
    1. 线程私有的,生命周期与线程一致。每次方法调用的数据都是通过栈传递;
    2. 由一个个栈帧组成,每个栈帧包括:局部变量表、操作数栈、动态链接、方法返回地址。
    3. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
    4. 如果虚拟机在栈扩展时,无法申请到足够的内存会抛出OutOfMemoryError异常。
  3. 本地方法栈
    1. 线程私有的,生命周期与线程一致。
    2. 执行为虚拟机使用到的Native方法服务。在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
    3. 同虚拟机栈;
    1. Java虚拟机所管理的内存中最大的一块。在虚拟机启动时创建,堆是线程共享的。
    2. 唯一目的是存放对象实例,及数组的内存分配JDK1.8后将运行时常量池也存放在堆中了
    3. 垃圾收集器管理的主要区域,也被称为GC 堆(Garbage Collected Heap)。
    4. 从垃圾回收的角度,现在收集器基本都采用分代垃圾收集算法,所以Java堆还可细分为:新生代和老年代;新生代又分为:Eden空间、From Survivor0、To Survivor1空间。进一步划分的目的是更好地回收内存,或者更快地分配内存
  4. 方法区
    1. 线程共享的。
    2. 存放已被虚拟机加载的运行时常量池、类结构信息、字段和方法数据,构造函数信息、静态变量等数据。
    3. 永久代是HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式。永久代是HotSpot的概念、方法区是Java虚拟机规范中的定义。
    4. JDK1.8实现将永久代(PermGen)替换为元空间(MetaSpace)的目的:
      1. PermGen 永久代内存大小很难调整。且由于永久代经常不够用或发生内存泄漏,报OOM异常。
      2. 为PermGen分配多大的空间很难确定,分配大小依赖于JVM加载的class总数,常量池大小,方法的大小。
      3. 元空间使用的是直接内存,即本地内存。最大可利用空间是整个系统内存的可用空间,且可以通过增加本地内存空间来满足类元数据信息的存储。降低OOM异常。
  5. 运行时常量池
    1. JDK1.7之前,运行时常量池存放在方法区,此时HotSpot虚拟机对方法区的实现为永久代。
    2. JDK1.7,运行时常量池中的字符串常量池从方法区拿到堆中,运行时常量池中剩下的东西还在方法区中,即HotSpot中的永久代中。
    3. JDK1.8,HotSpot移除了永久代,用元空间(MetaSpace)代替。运行池常量池移到了堆中。除此之外的,类结构信息等存放在元空间中。
  6. 直接内存
    1. 既不是运行时数据区的一部分,也不是虚拟机规范中定义的内存区域。
    2. 本机直接内存的分配,不会受到Java堆的限制,受本机总内存大小及处理器寻址空间的限制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值