详解JVM栈溢出和堆溢出
一、栈溢出*error
栈是线程私有的,生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。
栈溢出:方法执行时创建的栈帧个数超过了栈的深度。
原因举例:方法递归
【示例】:
public class stackerror { private int i = 0; public void fn() { system.out.println(i++); fn(); } public static void main(string[] args) { stackerror stackerror = new stackerror(); stackerror.fn(); } }
【输出】:
解决方法:调整jvm栈的大小:-xss
-xss size
sets the thread stack size (in bytes). append the letter
linux/x64 (64-bit): 1024 kbmacos (64-bit): 1024 kboracle solaris/x64 (64-bit): 1024 kbwindows: the default value depends on virtual memoryk
ork
to indicate kb,m
orm
to indicate mb, andg
org
to indicate gb. the default value depends on the platform:the following examples set the thread stack size to 1024 kb in different units:
-xss1m
-xss1024k
-xss1048576this option is similar to
-xx:threadstacksize
.
在idea中点击run菜单的edit configuration如下图:
设置后,再次运行,会发现i的值变小,这是因为设置的-xss值比原来的小:
二、堆溢出outofmemoryerror:java heap space
堆中主要存放的是对象。
堆溢出:不断的new
对象会导致堆中空间溢出。如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时。
【示例】:
public class heaperror { public static void main(string[] args) { list<string> list = new arraylist<>(); try { while (true) { list.add("floweryu"); } } catch (throwable e) { system.out.println(list.size()); e.printstacktrace(); } } }
【输出】:
解决方法:调整堆的大小:xmx
-xmx size
specifies the maximum size (in bytes) of the memory allocation pool in bytes. this value must be a multiple of 1024 and greater than 2 mb. append the letter
k
ork
to indicate kilobytes,m
orm
to indicate megabytes, andg
org
to indicate gigabytes. the default value is chosen at runtime based on system configuration. for server deployments,-xms
and-xmx
are often set to the same value. the following examples show how to set the maximum allowed size of allocated memory to 80 mb by using various units:-xmx83886080
-xmx81920k
-xmx80mthe
-xmx
option is equivalent to-xx:maxheapsize
.
设置-xmx256m
后,输入如下,比之前小:
到此这篇关于详解jvm栈溢出和堆溢出的文章就介绍到这了,更多相关栈溢出和堆溢出内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
C++内存分配方式详解(堆、栈、*存储区、全局/静态存储区和常量存储区)
-
一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么
-
JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
-
【JVM笔记】Java堆溢出
-
java.lang.*Error JVM栈溢出
-
JVM内存管理(内存分配和内存溢出异常)
-
详解MySQL的数据行和行溢出机制
-
详解JVM栈溢出和堆溢出
-
【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
-
OOM实战:堆内存溢出 虚拟机栈和本地方法栈溢出 jvm栈容量太小 栈帧太大 栈太小,导致线程分配少,创建更多的线程将导致oom 方法区和运行时常量池溢出