JAVA 基础知识点复习(六)JAVA对内存空间的划分

程序计数器

线程私有,也有称作为PC寄存器,用来指示执行那条指令的,如果执行的是java方法,记录的就是正在执行的虚拟机字节码指令的地址

线程私有,先进后出,存储的是一个个栈帧(局部变量表、操作数栈、动态链接,方法出口等),每个线程都有自己的java栈互不干扰,他的生命周期与线程相同,一旦调用结束,该栈帧出栈,对应的变量就被释放。

局部变量表:定义在方法中的变量加方法形参,如果是基本数据类型直接存储值,如果是引用类型则存储的是指向对象起始地址的引用指针。

本地方法栈

线程私有,本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。

线程共享,存储对象实例以及数组,不需要连续的内存和可以选择固定大小或者可扩展大小(-Xmx -Xms)

每个对象都有一个首地址值

堆内存的变量都有默认的初始值

垃圾回收机制会自动处理无用的对象

方法区

线程共享,存储了每个类Class的信息(包括类的名称、方法信息、字段信息)、常量池、静态成员以及编译器编译后的代码等,被称为永久代(Permanent Generation)。同时,由于类Class是JVM实现的一部分,并不是由应用创建的,所以又被认为是非堆(non-heap)内存

方法区是jvm规范中的一部分,永久代并不等同于方法区,只能说是方法区的一种实现,jdk8中移除了永久代,取而代之的是元数据区(metaspace),也可以看成是方法区的一种实现,并且将常量池和静态变量放到 Java 堆里

运行时常量池:用于存储编译期生成的各种字面量和符号引用,具备动态性,可在运行时期加入常量的引用,比如String#intern()

OutOfMemoryError & StackOverflowError

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能
对于虚拟机栈和本地方法栈,如果线程请求栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。如果虚拟机栈在扩展栈时无法申请到足够的内存空间,将抛出OutOfMemoryError异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值