JVM内存管理

     JVM采用自动内存管理机制,所以了解虚拟机在运行时的内存分配是很有必要的。运行时的内存区域主要由以下几种形式构成:
                                   这里写图片描述

程序计数器

      程序计数器是一块较小的内存,它记录的是当前线程所执行字节码文件的行号。java虚拟机的执行过程中采用各个线程交替执行的方式实现多线程,为了保证切换线程后可以恢复到正确的运行位置,程序计数器被设计为线程私有的。如果当前执行的是java方法,程序计数器记录的是当前字节码指令的地址;如果执行的是native方法,它的值为0。

虚拟机栈

      虚拟机栈也是线程私有的区域,它描述的是Java方法执行的内存模型。我们都知道Java方法的执行过程就是一个不断的“压栈”和“弹栈”的过程,虚拟机栈在Java方法执行过程中会创建栈帧,存储与方法相关的数据,如操作数栈、局部变量、方法出口等信息。这个区域规定了两种内存异常:

  • 当线程请求的栈深度超过虚拟机允许的最大深度会抛出StackOverFlowError异常;
  • 可动态扩展的栈空间如果无法申请到足够的内存空间时会抛出OutOfMemoryError异常。
  • 本地方法栈

         本地方法栈为虚拟机使用到的native方法服务,而且不同的虚拟机类型实现方式也有所差异,所以不研究。

    Java堆

         Java堆内存是内存区域划分中最大的一块区域,线程之间共享。它的作用就是存放new出来的Java对象,它是垃圾收集器管理的主要区域,并且根据分代式回收通常被划分为多个不同的带,以实现更高效的垃圾回收。堆空间可以在物理上不是连续的内存空间,只需要在逻辑上是连续的即可。如果堆内存没有足够的内存为对象分配空间,会抛出OutOfMemoryError异常。

    方法区

         方法区也是线程共享的内存区域,它存放的是与类相关的信息,如类的版本,常量,静态变量、方法描述等等,可以简单理解为“.class”文件存放的地方。通常也把方法区称为永久带,因为方法区中的数据在运行过程中通常是不会发生变化的,所以该区域较少出现垃圾收集行为。但是对于常量池的回收、类型的卸载等工作,又表明该区域确实是需要进行垃圾回收的。如果方法区内存无法满足内存分配需求,抛出OutOfMemoryError异常。
    ######补:运行时常量池
         运行池常量池作为方法区的一部分,用于存放在编译器就预置到class文件中的常量信息;但是常量池中的数据也可以在运行时动态添加,如String类的intern方法。该区域也存在抛出OutOfMemoryError异常的可能性。

    补充:内存溢出与内存泄露的区别:
                     内存溢出指内存空间不足;
                     内存泄露指应当回收的内存空间没有被回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值