zoukankan      html  css  js  c++  java
  • java stackoverflowerror与outofmemoryerror区别

    1、stackoverflow:

    每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中,只要这个方法还没返回,这个栈帧就存在。
    如果方法的嵌套调用层次太多(如递归调用),随着java栈中的帧的增多,最终导致这个线程的栈中的所有栈帧的大小的总和大于-Xss设置的值,而产生生StackOverflowError溢出异常。

    2、outofmemory:

    2.1、栈内存溢出

    java程序启动一个新线程时,没有足够的空间为改线程分配java栈,一个线程java栈的大小由-Xss设置决定;JVM则抛出OutOfMemoryError异常。

    2.2、堆内存溢出

    java堆用于存放对象的实例,当需要为对象的实例分配内存时,而堆的占用已经达到了设置的最大值(通过-Xmx)设置最大值,则抛出OutOfMemoryError异常。

    2.3、方法区内存溢出

    方法区用于存放java类的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。在类加载器加载class文件到内存中的时候,JVM会提取其中的类信息,并将这些类信息放到方法区中。
    当需要存储这些类信息,而方法区的内存占用又已经达到最大值(通过-XX:MaxPermSize);将会抛出OutOfMemoryError异常对于这种情况的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。这里需要借助CGLib直接操作字节码运行时,生成了大量的动态类。

    上面转自:https://blog.csdn.net/chenchaofuck1/article/details/51144223

    个人理解:

    stackoverflow,是线程运行时报的错,表示当前线程使用的栈内存已经超过最大值了。一般是是由于递归调用(一个线程内的方法递归调用),或者申请的局部变量太大,产生了超过栈内存最大值的数据。

    outofmemory,是数据创建前报的错,表示当前剩余的内存已经不够了,不能创建新的数据了。

  • 相关阅读:
    Elasticsearch 在部署时,对 Linux 的设置有哪些优化方 法?
    详细描述一下 Elasticsearch 搜索的过程?
    Memcached 服务特点及工作原理是什么?
    Memcached 服务分布式集群如何实现?
    如何监控 Elasticsearch 集群状态?
    对于 GC 方面,在使用 Elasticsearch 时要注意什么?
    memcached 和 MySQL 的 query ?
    memcached 如何实现冗余机制?
    memcached 能接受的 key 的最大长度是多少?
    memcached 的多线程是什么?如何使用它们?
  • 原文地址:https://www.cnblogs.com/xujanus/p/11551482.html
Copyright © 2011-2022 走看看