码迷,mamicode.com
首页 > 编程语言 > 详细

java虚拟机之常见的报错

时间:2018-08-28 20:17:31      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:flow   while   lis   溢出   进程   arraylist   简单   thread   stl   

1、最简单的内存溢出

public class HeapOOM {
    HeapOOM[] testlist= new HeapOOM[100000];
    public static void main(String[] args) {
        List<HeapOOM> list= new ArrayList<HeapOOM>();
        while(true){
            list.add(new HeapOOM());
        }
    }
}

  

2、虚拟机栈和本地方法栈溢出(-Xss:栈内存容量)

  两种异常:

    如果线程请求的深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

    如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

  单线程时栈溢出:

public class StackOverflow {
    private int stackLength = 1;
    public void stackLeak(){
        stackLength++;
        stackLeak();
    }

    public static void main(String[] args) throws Throwable {
        StackOverflow stackOverflowError = new StackOverflow();
        try {
            stackOverflowError.stackLeak();
        }catch (Throwable e){
            System.out.println("stack 深度:"+stackOverflowError.stackLength);
            throw e;
        }

    }
}

  多线程下的栈溢出:

    通过不断建立线程的方式可以产生内存溢出异常。在这种情况下,为每个线程的栈分配的内存越大,越容易产生内存溢出异常。

原因是:操作系统分配给每个进程的内存是有限制的,譬如32位的Windows限制为2GB。虚拟机提供了参数来控制Java堆和方法区的两部分内存的最大值。剩余的内存为2GB减去Xmx(最大堆容量),再减去MaxPermSize(最大方法区容量)

public class StackOverThread {
    private void donnotStop(){
        while (true){
            donnotStop();
        }
    }
    public void stackLeakByThread(){
        while (true){
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    donnotStop();
                }
            });
            thread.start();
        }

    }
    public static void main(String[] args) {
        StackOverThread stackOverThread = new StackOverThread();
        stackOverThread.stackLeakByThread();
    }
}

  

3、

  

java虚拟机之常见的报错

标签:flow   while   lis   溢出   进程   arraylist   简单   thread   stl   

原文地址:https://www.cnblogs.com/yaohuiqin/p/9550254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!