首页 > 系统相关 >Java栈溢出|内存泄漏|内存溢出

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

时间:2024-08-13 15:39:00浏览次数:17  
标签:Java Apple 线程 内存 public 溢出

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 都被存储在栈帧里。

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

img

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

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

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

  • 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用。
  • 内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,进而导致内存逐渐被占光。
  • memory leak 最终会导致 out of memory。

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

  • 如果新线程在申请栈时失败了,就会抛出 OutOfMemoryError(内存溢出) 错误。
  • 或者当JVM不能分配给对象的创建空间,也会抛出 OutOfMemoryError 错误。

小结:

  • StackOverflowError:递归过深,递归没有出口。
  • MemoryLeak:申请内存后,无法释放已申请的内存空间。
  • OutOfMemoryError:JVM空间溢出,创建对象速度高于GC回收速度。

标签:Java,Apple,线程,内存,public,溢出
From: https://www.cnblogs.com/GilbertDu/p/18357052

相关文章

  • java基础-封装
    封装(数据的隐藏)私有属性实现方式:get/set封装(Encapsulation)是面向对象编程中的一个核心概念,它指的是将对象的内部状态(即数据)和行为(即方法)隐藏起来,只暴露给外部一些必要的接口,以保护对象的完整性和安全性。通俗理解:想象一个遥控器:按钮:这是你能看到和操作的部分,通过按......
  • 24-08-08 JavaSE Map集合
    24-08-08javaSEMap集合Map接口的特点Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value(双列元素)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中3.Map中的key不允许重复,原因和HashSet一样,前面分析过源码.Map......
  • Java String常用类、数组、日期时间
    JavaString类一、创建字符串1、简单方式:Stringstr="seventeen";2、用构造函数创建字符串:Stringstr2=newString("seventeen");String创建的字符串存储在公共池中,而new创建的字符串对象在堆上String类是不可改变的,所以一旦创建了String对象,那它的值就无法改变了如果需......
  • JavaScript函数
    定义函数形如functionabs(x){if(x>=0){returnx;}else{return-x;}}或varabs=function(x){if(x>=0){returnx;}else{return-x;}};如上所表达的函数为一个匿名函数,它没有函数名,该......
  • 【原创】java+swing+mysql校园表白墙系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:昨天七夕,大家都去约会了,趁着有时间写了一个校园表白墙系统。在校园环境中,学生们正处于青春期,情感丰富且......
  • 【原创】java+swing+mysql简单图书信息管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:编程小白们刚入门,尤其在学了一点java的基础之后,想通过自己动手来实现一个比较基础的小项目,由于编程经验......
  • 问题 IDEA创建Sping项目只能勾选17和21,却无法使用Java8
    想创建一个springboot项目,本地安装jdk版本为1.8,但是在使用SpringInitializr创建项目时,版本只能选择21或17在JDK为1.8的情况下,无论选择Java17版本或者21版本时,都会报错。Java17和Java8(JDK1.8)的区别版本号:Java17是JavaSE17的版本,而JDK1.8是JavaSE8的版本。发......
  • Java SSE:实现服务器推送数据客户端
            体验过大语言模型的人(chatgpt,文心一言,通义千问...)都知道,大模型的回答是一边思考一边返回数据的,属于流式响应。要达到这种效果就需要实现前后端的即时通讯。SSE        SSE(Server-sentEvents):WebSocket的一种轻量代替方案,使用HTTP协议,用于实现服务......
  • JavaSE基础(5)——抽象类与接口
    目录1、abstract关键字 2、抽象方法3、抽象类4、接口5、接口与抽象类的区别6、JDK8版本接口新特性7、类之间的关系8、UML类图1、abstract关键字 可以修饰类和方法,不可以修饰属性,对应的类和方法就称之为抽象类和抽象方法;2、抽象方法有抽象方法的类一定是抽象类......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......