-
2019-12-12 19:57:08
java虚拟机栈和本地方法栈都是描述方法执行的内存模型,每个方法在执行的同时,都会创建一个栈帧,栈帧用于存储局部变量表等信息。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈 的过程。
内存溢出的原因:
调用方法太多,超过了内存区域,比如多次递归之类的。
内存溢出的现象:
(1)线程请求的栈深度大于允许的最大深度stackoverflowerror,一般单线程才会出现这个现象。
(2)虚拟机在扩展栈时无法申请到足够的内存outofmemoryerror:unable to create new native thread,一般多线程的时候会出现,线程与栈分享内存资源,导致内存变小。
解决思路:
合理分配栈的大小,通过-Xss128k 可以设置栈内存的大小。
更多相关内容 -
【Java面试】Java 内存溢出 栈溢出的原因与排查方法
2022-03-24 15:38:251、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc...1、 内存溢出的原因是什么?
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)
三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。
五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。
六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。如String s1 = “My name”;
String s2 = “is”;
String s3 = “xuwei”;
String str = s1 + s2 + s3 +…;这是会容易造成内存溢出的
但是String str = “My name” + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+“时,应选用String性能更好;如果是String类进行”+"时,在不考虑线程安全时,应选用StringBuilder性能更好。
七)使用 DDMS工具进行查找内存溢出的大概位置
class Solution { private String aString = "abc"; public void add() { while (true) { aString += aString; } } public static void main(String[] args) { new Solution().add(); } }
2、栈溢出的原因
一)、是否有递归调用
二)、是否有大量循环或死循环
三)、全局变量是否过多
四)、 数组、List、map数据是否过大
五)使用DDMS工具进行查找大概出现栈溢出的位置栈溢出的例子:
class Solution { int count = 0; public void add() { System.out.println(count++); add(); } public static void main(String[] args) { new Solution().add(); } }
-
java 内存溢出 栈溢出的原因与排查方法
2021-02-12 09:48:511、 内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc ...1、 内存溢出的原因是什么?
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)
三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。
五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。
六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。
在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。
七)使用 DDMS工具进行查找内存溢出的大概位置
2、栈溢出的原因
一)、是否有递归调用
二)、是否有大量循环或死循环
三)、全局变量是否过多
四)、 数组、List、map数据是否过大
五)使用DDMS工具进行查找大概出现栈溢出的位置
-
java内存溢出示例(堆溢出、栈溢出)
2021-03-08 09:56:08堆溢出:/*** @author LXA* 堆溢出*/public class Heap{public static void main(String[] args){ArrayList list=new ArrayList();...}}}报错:java.lang.OutOfMemoryError: Java heap space栈溢出...堆溢出:/**
* @author LXA
* 堆溢出
*/
public class Heap
{
public static void main(String[] args)
{
ArrayList list=new ArrayList();
while(true)
{
list.add(new Heap());
}
}
}
报错:
java.lang.OutOfMemoryError: Java heap space
栈溢出:/**
* @author LXA
* 栈溢出
*/
public class Stack
{
public static void main(String[] args)
{
new Stack().test();
}
public void test()
{
test();
}
}
报错:
java.lang.StackOverflowError
更多java内存溢出示例(堆溢出、栈溢出)相关文章请关注PHP中文网!
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
-
java内存溢出和栈溢出
2018-06-08 00:54:27出自:https://blog.csdn.net/lirenzuo/article/details/71710543一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆... -
java内存溢出 栈溢出的原因与排查方法
2021-01-26 18:55:19java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用... -
Java栈内存溢出代码实例
2019-12-11 21:16:25递归调用会产生栈溢出 -
Java常见内存溢出异常分析
2021-01-20 03:46:13下面我们通过一段代码来模拟一下此种情况的内存溢出。 import java.util.*; import java.lang.*; public class OOMTest{ public void stackOverFlowMethod(){ stackOverFlowMetho -
java内存溢出和栈溢出实例以及内存溢出和内存泄露的区别
2017-09-24 15:24:26package com.www.lyz; import java.util.ArrayList; import java.util.List; public class a5 { public static int c = 0; public static int d = 0; public static List list = new Array -
五种内存溢出案例总结:涵盖栈深度溢出、永久代内存溢出、本地方法栈溢出、JVM栈内存溢出和堆溢出
2021-11-23 02:15:17涵盖栈深度溢出、永久代内存溢出、本地方法栈溢出、JVM栈内存溢出和堆溢出,让你彻底理解内存溢出!! -
谈谈:java内存溢出的2种情况
2021-11-29 11:38:16从jvm的角度看发生的情况是: 1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据... -
什么情况下会发生栈内存溢出?
2021-03-21 21:51:49每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息,如果线程所请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError 栈内存溢出异常,一般在方法递归... -
Java内存溢出与栈溢出分析
2018-06-14 15:53:18一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆持久带 = 方法区 + 其他堆 = Old Space + Young SpaceYoung Space = ... -
栈内存溢出案例(StackOverflowError)
2022-03-20 22:27:34栈(stack)内存溢出案例 -
Java内存溢出与栈溢出
2021-03-15 10:34:57https://blog.csdn.net/z69183787/article/details/75530650一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆持久带 =... -
Java栈内存堆内存溢出及相关JVM参数配置总结
2021-03-10 07:40:10一:Java里内存溢出分为栈内存溢出和堆内存溢出,不过一般而言我们说某个Java应用发生了内存溢出就是指堆内存溢出,即OOM,对应java.lang.OutOfMemoryError这个异常(错误);而栈内存溢出则是java.lang.StackOverflow... -
Java中递归的概念-浅谈栈内存溢出现象-递归的使用
2020-11-29 20:44:36递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出 构造方法禁止递归 递归的使用前提: 当调用方法的时候,方法的... -
常见的Java内存溢出情况和实例
2022-04-22 19:53:38文章目录内存溢出的原因栈溢出栈溢出的第1种情况,死递归,抛出StackOverflowError栈溢出的第2种情况,线程太多,抛出OutOfMemoryError堆溢出1.初始对象太大,超过机器内存,抛出OutOfMemoryError: Java heap space2... -
JAVA系统启动栈内存溢出-StackOverflowError
2021-03-08 03:10:06JAVA系统启动栈内存溢出-StackOverflowError线上服务器启动报错日志如下:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a ... -
Java的内存溢出和内存泄露
2022-04-11 19:45:12详解Java的内存溢出和内存泄漏 -
Java中栈溢出StackOverFlowError和内存溢出OutOfMemoryError的区别
2020-06-20 23:09:031.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;当线程调用一个方法是,jvm压入一个新的栈帧到这个...2.1 栈内存溢出 java程序启动一个新线程时 -
java 内存溢出 栈溢出的原因
2019-03-04 13:53:06内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性...