Java 各种溢出测试

本文详细介绍了Java的内存组成部分,包括程序计数器、虚拟机栈、本地方法栈、方法区和堆,并通过测试代码展示了堆溢出、栈溢出、永久代溢出和直接内存溢出的情况。堆溢出在创建大量对象时发生,栈溢出在栈深度超过限制时抛出StackOverflowError,JDK1.8后永久代被元空间替代,直接内存溢出涉及系统使用直接内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 各种溢出测试

前置知识点:Java内存组成

这里写图片描述
注意上图:蓝色为所有线程共享的数据区,紫色为线程的私有区。

1)程序计数器:

在计算机组成结构这门课里面,我们就学到CPU里面有个PC寄存器,这个寄存器主要指CPU当前运行的指令。
在这里,其实也是一样的,对于每一个线程,都有一个PCR,用来记录程序在当前线程执行的位置。当线程阻塞后然后再重新运行,就可以在PC记录的位置继续执行了。
线程之间的PC互不影响,所以称为线程私有的。同时,PC是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2)虚拟机栈(VM Stack):

线程私有,生命周期与线程一样。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。栈顶为当前执行的方法。

主要解释下局部变量表:主要存放各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)。我们笼统的把Java内存分为Heap,Stack,这里就是Stack咯。

栈中数据是可以共享的,编译器先处理 int a = 3;首先它会在栈中创建一个变量为 a 的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将 a 指向3的地址。接着处理 int b = 3;在创建完 b 这个引用变量后,由于在栈中已经有3这个字面值,便将 b 直接指向3的地址。这样,就出现了 a 与 b 同时均指向3的情况。

3)本地方法栈(Native Method Stacks):
就是native方法。 
4)方法区(Method Area)

线程共享的。主要存放类型信息,包括
类的类型,限定符,类名等很多信息
变量的变量名,类型,修饰符
方法的方法名,参数,返回类型,修饰符
类的静态变量
常量池(等下会具体说明)
很多时候,对于习惯在HotSpot虚拟机上开发和部署程序的开发者来说,很多人愿意把方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值