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虚拟机上开发和部署程序的开发者来说,很多人愿意把方