Java 工作线程OOM,其他线程会怎么样?进程会死掉吗
初看到这一问题,觉得这题是在考察JVM的内存结构。我第一反应是OOM的常见情况堆溢出,也就是下面的这种异常
java.lang.OutOfMemoryError: Java heap space
默想如下
在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享。
所以按照这个思路去思考的话,看到这个题目首先就会想到 如果堆内存是共享的话,那么单独的子线程内存溢出也就是堆占用满了 其他线程自然也就不能工作了。然后实验结果却不是这样
开始实验
编译工具:IDEA
内存检测工具:VisualVm
基本参数设置如下:
-mx80 -XX:MaxPermSize=50m
最大可用的堆内存是80M 最大可使用的非堆内存是50m按需分配
测试代码如下
public static void main(String[] args) {
long memory = Runtime.getRuntime().maxMemory();
System.out.println(String.format(