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. 2>&1解释

    场景 /root/test.sh > runoob.log 2>&1 那2>&1是什么意思? 解释 将标准错误 2 重定向到标准输出 &1 ,标准输出 &am ...

  2. GitHub上狂揽62Kstars的程序员做饭指南

    写在前面 作为一名程序员,我们经常会在全球最大的同性交友网站 GitHub上寻找一些优质的开源项目来学习,以提升自己的专业技能. 今天给大家推荐的是一个GitHub上狂揽61K的开源项目.项目名叫做H ...

  3. python重拾基础第二天

    本节内容 列表.元祖操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换 1. 列表操作 ...

  4. Apache Kylin(二)在EMR上搭建Kylin

    EMR上搭建kylin 1. 启动EMR集群 根据官网说明: http://kylin.apache.org/docs21/install/kylin_aws_emr.html 启动EMR时,若是 h ...

  5. 在高通lk中添加自定义源文件

    在高通lk中添加自定义源文件 背景 在lk开发中,需要添加一个自定义功能,但是又不希望代码污染无关的文件(把无关代码添加到某个源文件中是一种罪). 以添加一个aw9523b.c的驱动为例,在aboot ...

  6. 通过 源码 安装 python

    为了vim PYTHON="3.4.1" tget () { #try wget filename=`basename $1` echo "Downloading [${ ...

  7. FFMpeg 中的数据结构

    FFMpeg 中比较重要的函数以及数据结构如下: 数据结构: (1) AVFormatContext (2) AVOutputFormat (3) AVInputFormat (4) AVCodecC ...

  8. 攻防世界——Misc新手练习区解题总结<4>(11、12题)

    第十一题ext3: 方法一:挂载 需要工具:kali虚拟机 下载附件后得到一个linux的系统光盘,我们用kali挂载一下 mount 123 /mnt//123为要挂载的文件名 寻找flag.txt ...

  9. Windows批处理文件(.bat和.cmd)

    cmd文件和bat文件的区别 从文件描述中的区别是,cmd文件叫做:Windows命令脚本,bat文件叫:批处理文件,两者都可以使用任意一款文本编辑器进行创建.编辑和修改,只是在cmd中支持的命令要多 ...

  10. 树莓派4B-PCA9685驱动舵机

    前言 不知道你们有没有遇到过这么一种情况,直接用树莓派的引脚输出PWM控制舵机,舵机是会出现抖动的.就算代码进行一定的时延迟优化还是会有影响的. 现在我们可以使用PCA9685这个模块去驱动舵机. P ...