写点什么

Java 栈溢出|内存泄漏|内存溢出

作者:EquatorCoco
  • 2024-10-18
    福建
  • 本文字数:975 字

    阅读完需:约 3 分钟

Java 虚拟机栈是线程私有的,它的生命周期和线程同步


一个线程每执行到一个方法,JVM 就会创建一个栈帧(用于存储基本数据类型、对象指针和返回值等),并将栈帧压入栈中。


代码示例:


public class Example {    public static void main(String[] args) {        Example example = new Example();        example.m1();    }
public void m1() { int x = 0; m2(); } public void m2() { Apple y = new Apple(); m3(); } public void m3() { float z = 1.0f; }}
复制代码


执行流程:



  • 首先,程序启动,main() 方法入栈。

  • 然后,m1() 方法入栈,声明 int 类型变量 x = 0。注意,无论是 x 还是 0 都存储在栈帧中。

  • 接着,m2() 方法入栈,创建了一个 Apple 对象,并被赋给变量 y。请注意,实际的 Apple 对象是在 Java 堆内存中创建的,而不是线程栈中,只有 Apple 对象的引用以及变量 y 被包含在栈帧里。

  • 最后,m3() 方法入栈,声明 float 类型变量 z = 1.0f。同理,z 和 1.0f 都被存储在栈帧里。


当方法执行完成后,所有的线程栈帧将按照后进先出的顺序逐一出栈,直至栈空为止



Java 线程栈默认大小是由操作系统决定的,一般为 1MB 或 2MB。如果需要调整线程栈的大小,可以使用-Xss参数来设置。在实际开发中,默认的线程栈大小通常已经足够满足需求,只有在遇到线程栈溢出错误时才需要考虑调整大小。


一旦递归过深,线程栈的容量增长超过了允许的栈容量,就会抛出 StackOverflowError(栈溢出) 错误。

那么什么是内存泄漏和内存溢出呢?


  • 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用。

  • 内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,进而导致内存逐渐被占光。

  • memory leak 最终会导致 out of memory。


内存溢出异常抛出的原因(包括但不限于):


  • 如果新线程在申请栈时失败了,就会抛出 OutOfMemoryError(内存溢出) 错误。

  • 或者当 JVM 不能分配给对象的创建空间,也会抛出 OutOfMemoryError 错误。


小结:


  • StackOverflowError:递归过深,递归没有出口。

  • MemoryLeak:申请内存后,无法释放已申请的内存空间。

  • OutOfMemoryError:JVM 空间溢出,创建对象速度高于 GC 回收速度。


文章转载自:救苦救难韩天尊

原文链接:https://www.cnblogs.com/GilbertDu/p/18357052

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Java栈溢出|内存泄漏|内存溢出_Java_EquatorCoco_InfoQ写作社区