程序计数器 : 线程私有 唯一一个不会发生内存溢出的区域 存放了正在执行的虚拟机字节码指令地址.
栈 : 线程私有 每一个方法从调用到执行完成的过程,就对应着一个栈帧(存储了局部变量表等信息)在虚拟机栈中入栈和出栈的过程.
局部变量表存放了编译可知的各种基本数据类型 , 对象引用和returnAddress类型(指向了一条字节码指令的地址)
堆 : 线程共享 存放对象的实例
方法区 : 线程共享 用于储存已被虚拟机加载的类信息 , 常量 , 静态变量 , 即时编译器变异后的代码等数据.
问题:
1.无限创建对象会导致java堆内存溢出
2.无限创建线程会导致栈内存溢出
线程内存分配越大可能导致stackOverflowError
3.使用list保存字符串的引用并调用String.intern()方法放入常量池会导致方法区和常量池内存溢出
String.intern()是一个native方法,作用 : 如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象,
否则,将此String对象包含的字符串添加到常量池中,并返回此String对象的引用