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回收速度。

Java栈溢出|内存泄漏|内存溢出的更多相关文章

  1. 说说JVM原理?内存泄漏与溢出的区别?何时产生内存泄漏?

    1.JVM原理 JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以 ...

  2. JavaScript闭包(内存泄漏、溢出以及内存回收),超直白解析

    1 引言 变量作用域 首先我们先铺垫一个知识点--变量作用域: 变量根据作用域的不同分为两种:全局变量和局部变量. 函数内部可以使用全局变量. 函数外部不可以使用局部变量. 当函数执行完毕,本作用域内 ...

  3. 内存溢出,内存泄漏,CPU溢出区别

    内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...

  4. 【java虚拟机】内存溢出与内存泄漏

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7354857.html 一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提 ...

  5. java中的内存溢出和内存泄漏

    内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...

  6. java中内存溢出和内存泄漏的区别

    虽然在java中我们不用关心内存的释放, 垃圾回收机制帮助我们回收不需要的对象,但实际上不正当的操作也会产生内存问题:如,内存溢出.内存泄漏 内存溢出:out of memory:简单通俗理解就是内存 ...

  7. java的GC与内存泄漏

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  8. JVM内存溢出与内存泄漏

    内存溢出与内存泄漏 内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一. 由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃 ...

  9. C++内存溢出和内存泄漏?

    1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...

  10. C/C++中内存泄漏、内存溢出与野指针的解释与说明

    1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是 ...

随机推荐

  1. admission-controllers

    WebHook是什么  官方文档: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controller ...

  2. Kubernetes 存储资源 PV、PVC 和StorageClass详解

    一.存储机制介绍 在 Kubernetes 中,存储资源和计算资源(CPU.Memory)同样重要,Kubernetes 为了能让管理员方便管理集群中的存储资源,同时也为了让使用者使用存储更加方便,所 ...

  3. Meilisearch 安装和使用教程

    如今搜索功能已成为几乎所有应用不可或缺的一部分.无论是电商平台.内容管理系统,还是企业内部知识库,用户都期待能够快速.准确地找到他们需要的信息.然而,传统的搜索解决方案往往面临着诸多挑战:响应速度慢. ...

  4. OpenCV程序:OCR文档扫描

    一.文档扫描 代码 import cv2 import numpy as np #==============================计算输入图像的四个顶点的坐标=============== ...

  5. 全国产!瑞芯微RK3568J/RK3568B2工业核心板规格书

    核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板,每核主频高达1.8GHz/2.0GHz.核心板CP ...

  6. 复习 - ajax

    复习呢有一个很直观的感受,就是以前学的东西,萌懂半懂的,这一来全部都清楚了,你以前以为你学的并不好但是复习一次把以前的案例一做,居然能够自己独立完成,知识点看着掌握的还不错. 1. 两天时间就把整个a ...

  7. ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'

    前言 最近有个需求,需要在 ubnutu22 上使用 pyinstaller 打包一个python2 的文件. 中间遇到了一些问题: pip2 install pyinstaller 报错 解决方案: ...

  8. koa web框架入门

    1.在hello-koa这个目录下创建一个package.json,这个文件描述了我们的hello-koa工程会用到哪些包.完整的文件内容如下: { "name": "h ...

  9. DASCTF X CBCTF 2023|无畏者先行 [PWN] WP

    DASCTF X CBCTF 2023|无畏者先行 [PWN] WP 1.GuestBook 题目保护情况 开启canary,nx保护 64位ida载入 首先可以通过输入0x18个垃圾数据可以通过打印 ...

  10. 24 年 “年薪百万” 的 Java 程序员,都要学什么?

    大家好,我是程序员鱼皮.前几天我看了一篇由国外的 Java 架构师大佬分享的文章,主题是 "Java 架构师必会的 20 个技术". 光看这个标题,就知道在国外做 Java 开发, ...