首页 > 极客资料 博客日记
Java栈溢出|内存泄漏|内存溢出
2024-08-13 16:00:03极客资料围观23次
本篇文章分享Java栈溢出|内存泄漏|内存溢出,对你有帮助的话记得收藏一下,看极客之家收获更多编程知识
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回收速度。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”