StackOverflowError 和 OutOfMemoryError

package cn.zno.outofmomery;

import java.util.ArrayList;
import java.util.List;

public class Test {

    void s() {
        s();
    }

    void h() {
        List<byte[]> list = new ArrayList<byte[]>();
        while (true) {
            list.add(new byte[1024 * 1024]);
        }
    }

    public static void main(String[] args) {
     // new Test().s(); // StackOverflowError
        new Test().h(); // OutOfMemoryError
    }
}
时间: 2024-10-15 04:41:32

StackOverflowError 和 OutOfMemoryError的相关文章

JVM StackOverflowError vs. OutOfMemoryError

if the computation in a thread needs a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError; if Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient

Jvm(10),运行时数据---独占区---StackOverflowError和OutOfMemoryError区别

1.StackOverflowError 源代码解释说:抛出这个错误是因为递归太深.其实真正的原因是因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法. public class StackOverflowTest { public static void main(String[] args){ method(); } private static void method

【转】深入理解JVM—JVM内存模型

http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变

JAVA内存区域及使用分配

JAVA虚拟机运行时会将JVM使用的内存划分为不同的区域,每个区域负责不同的功能,以及各个区域的创建,销毁都各不相同. 下图是JVM运行时内存数据区的划分, 图1.JVM运行时数据区 1.程序计数器 每个线程都拥有一个独立的程序计数器,用于记录当前线程所要执行的字节码指令,该类内存区域为"线程私有"内存. 2.虚拟机栈 该区域也有人称为栈内存(对应java堆内存),这个叫法不完全正确,但可以便于理解. 该区域也是线程私有的,并且与线程的生命周期相同. 主要负责方法执行的内存部分,在每个

JVM内存结构

一.JVM内存结构 1.1 下面总体说说内存 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) 1.2 下面说说具体各个结构的功能 1.2.1.程序计数器(Program Counte

第5章 JVM调优

5.1 Java虚拟机内存模型 Java虚拟机内存模型是Java程序运行的基础.JVM将其内存数据分为程序计数器,虚拟机栈,本地方法栈,Java堆和方法区等部分. 程序计数器:用于存放下一条运行的指令: 虚拟机栈和本地方法栈:用于存放函数调用堆栈信息: Java堆:用于存放Java程序运行时所需的对象等数据: 方法区:用于存放程序的类元数据信息: 5.1.1 程序计数器 程序计数器是一块很小内存空间.由于Java是支持线程的语言,当线程数量超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源.

第2章 Java内存区域与内存溢出异常

2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.如下图所示: 2.1.1 程序计数器 程序计数器是一块较小的内存空间,它是线程的私有内存,可以看作时当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值

Java虚拟机内存模型

1)程序计数器:线程私有 当线程数量超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源,对于单核CPU来说,每一个时刻,只能有一个线程在运行,而其他线程必须被切换出去.因此,每个线程都有一个独立的程序计数器,用于记录下一条要运行的指令,各个线程之间的计数器互不影响,是一块线程的私有内存空间.当一个线程正在执行一个Java方法时,程序计数器记录正在执行的Java字节码地址,如果执行的是native方法,则计数器为空 2)Java虚拟机栈:线程私有 同Java线程同时间创建,用于保存方法的局部变

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁