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

这系列博文主要是将自己之前学习的一些java基础内容进行归纳与总结。

程序计数器

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

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

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

本地方法栈

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

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

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

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

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

扫描二维码关注公众号,回复: 11154989 查看本文章

方法区

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

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

OutOfMemoryError & StackOverflowError

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

原创文章 7 获赞 0 访问量 6217

猜你喜欢

转载自blog.csdn.net/weixin_42598683/article/details/105817322