一、java运行时数据区域

1、程序计数器
线程私有,指向下一步执行的字节码,不会发生OOM。
2、java虚拟机栈
存储和方法相关的数据。包括:局部变量,对象的引用和返回值的地址。
3、本地方法栈
和java虚拟机栈非常相似,区别是为本地方法服务。
4、java堆
存放对象代实例和数组的本体
5、方法区
这个名字非常坑爹度认为这个区域是存放方法的。但是它存储的是类信息,常量和静态变量。类信息指的是对象对应代类型,父类等。在新建一个对象以后,会将类信息放入方法区。
5、1、常量池
是方法区代一部分。
重点问题,变量都存储在什么地方
普通类变量:存储在java堆。
静态变量和常量:存储在方法区。
局部变量:存储在java虚拟机栈。

二、OOM

五种情况
1、java堆发生oom。建立的对象太大或者太多,比如超大数组。
2、java虚拟机栈发生oom。注意!虚拟机栈在扩展的时候没有足够的空间了,才叫OOM,递归调用太多,导致栈高度超过系统承受能力叫栈异常!
3、运行时常量池异常,基本上是因为非对象的String太多或者太长导致代。
4、方法区溢出。因为加载的类太多了导致代异常。
5、本机内存溢出。比如NIO里面代channel,属于三不管。channel存储代数据太多,会导致本机内存溢出。

三、类加载的过程

1、加载
(1)根据路径和文件名找到对应代class文件
(2)将文件中代静态存储结构转化为方法区中代数据结构。注意,是数据结构,没有值。
(3)在java堆里面产生一个对象。
2、验证
验证文件代正确性。面试官不会问太细致。
3、准备
为类变量分配内存并设置类变量初始值的阶段。注意,类变量是静态变量。初始化值是0或者null。

public static int a=123;

准备以后,a值是0;
但是final常量除外。
4、解析
将常量池里面代符号引用转换为直接。
5、初始化
定义静态变量时指定初始值。如 private static String x=“123”;
在静态代码块里为静态变量赋值。如 static{ x=“123”; }