精华内容
下载资源
问答
  • 2019-12-12 19:57:08

    java虚拟机栈和本地方法栈都是描述方法执行的内存模型,每个方法在执行的同时,都会创建一个栈帧,栈帧用于存储局部变量表等信息。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈 的过程。

    内存溢出的原因:

    调用方法太多,超过了内存区域,比如多次递归之类的。

    内存溢出的现象:

    (1)线程请求的栈深度大于允许的最大深度stackoverflowerror,一般单线程才会出现这个现象。

    (2)虚拟机在扩展栈时无法申请到足够的内存outofmemoryerror:unable to create new native thread,一般多线程的时候会出现,线程与栈分享内存资源,导致内存变小。

    解决思路:

    合理分配栈的大小,通过-Xss128k 可以设置栈内存的大小。

    更多相关内容
  • 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成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();
    	}
    }
    
    展开全文
  • 1、 内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成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工具进行查找大概出现栈溢出的位置

    展开全文
  • 溢出:/*** @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内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用...
  • 递归调用会产生栈溢出
  • 下面我们通过一段代码来模拟一下此种情况的内存溢出。  import java.util.*;  import java.lang.*;  public class OOMTest{  public void stackOverFlowMethod(){  stackOverFlowMetho
  • package 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栈内存溢出和堆溢出,让你彻底理解内存溢出!!
  • 从jvm的角度看发生的情况是: 1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据...
  • 每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息,如果线程所请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError 栈内存溢出异常,一般在方法递归...
  • Java内存溢出溢出分析

    千次阅读 2018-06-14 15:53:18
    一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆持久带 = 方法区 + 其他堆 = Old Space + Young SpaceYoung Space = ...
  • (stack)内存溢出案例
  • Java内存溢出溢出

    2021-03-15 10:34:57
    https://blog.csdn.net/z69183787/article/details/75530650一、背景知识1、JVM体系结构2、JVM运行时数据区3、JVM内存模型JVM运行时内存 = 共享内存区 + 线程内存区3-1、共享内存区共享内存区 = 持久带 + 堆持久带 =...
  • 一:Java里内存溢出分为栈内存溢出和堆内存溢出,不过一般而言我们说某个Java应用发生了内存溢出就是指堆内存溢出,即OOM,对应java.lang.OutOfMemoryError这个异常(错误);而栈内存溢出则是java.lang.StackOverflow...
  • 递归一定要有条件限定,保证递归能够停止下来,否则就会发生栈内存溢出 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出 构造方法禁止递归 递归的使用前提: 当调用方法的时候,方法的...
  • 文章目录内存溢出的原因溢出溢出的第1种情况,死递归,抛出StackOverflowError溢出的第2种情况,线程太多,抛出OutOfMemoryError堆溢出1.初始对象太大,超过机器内存,抛出OutOfMemoryError: Java heap space2...
  • JAVA系统启动栈内存溢出-StackOverflowError线上服务器启动报错日志如下:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a ...
  • 详解Java内存溢出和内存泄漏
  • 1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;当线程调用一个方法是,jvm压入一个新的栈帧到这个...2.1 栈内存溢出 java程序启动一个新线程时
  • java 内存溢出 溢出的原因

    千次阅读 2019-03-04 13:53:06
    内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,039
精华内容 30,415
关键字:

java栈内存溢出

java 订阅