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 memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Memory stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

Example of StackOverflowError: limit the size of a thread‘s stack size and the do a deep recursion

 1 public class Main {
 2
 3     public static void main(String[] args) {
 4         new Thread(null, new Runnable() {
 5             public void run() {
 6                 {
 7                     System.out.println(fact(1<<15));
 8                 }
 9             }
10             private long fact(int n) {
11                 return n < 2 ? 1 : n * fact(n-1);
12             }
13         }, "thread", 1<<20).start();
14     }
15 }

Example of OutOfMemoryError: limit -Xmx and create large objects (like using StringBuilder)

 1 public class Main2 {
 2
 3     public static void main(String[] args) {
 4         new Thread(null, () -> {
 5             {
 6                 StringBuilder builder = new StringBuilder();
 7                 for (int cnt = 0; cnt < 100000000; cnt++) {
 8                     builder.append(cnt);
 9                 }
10
11                 try {
12                     Thread.sleep(15000000);
13                 } catch (InterruptedException e) {
14                     e.printStackTrace();
15                 }
16             }
17         }, "thread", 1 << 20).start();
18     }
19 }
时间: 2024-12-23 22:26:24

JVM StackOverflowError vs. OutOfMemoryError的相关文章

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

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

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

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

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

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资源.

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

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

《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)

第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 OpenJDK 中所带的虚拟机,最初并不是Sun开发 Sun Mobile- Embedded VM/ Meta- Circular VM BEA JRockit/ IBM J9 VM JRockit曾号称世界上最快的java虚拟机,BEA公司发布.J9属于IBM主要扶持的虚拟机 Azul VM/ BEA

jvm 内存分配 (转)

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

深入理解JVM—JVM内存模型

原文地址:http://www.lofter.com/app/QRCodedownload?act=qbbkdlxz_20150313_13 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因