热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

StackOverflowError和OOM

StackOverflowError本地方法栈和虚拟机栈是线程所私有的,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括

StackOverflowError

本地方法栈和虚拟机栈是线程所私有的,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引用;

产生原因:当前线程请求的栈深度超过了虚拟机所允许的栈深度,常发生在递归或者死循环当中。

可以通过修改-xss参数调整栈大小

OOM(Out Of Memory)

堆(heap)是被所有线程共享的一块区域,


内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。

解决办法:通过内存监控软件,查找程序中的泄露代码



内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

解决办法:可以通过虚拟机VM参数进行修改


产生原因:



  • 当java的垃圾回收机制没有及时回收堆中的静态变量/类等,导致堆溢出。

  • 强引用太多,因为强引用不会被回收。


Java中的四种引用:强引用、软引用、弱引用、虚引用

强引用:

强引用是我们最常见,也是最熟悉的普通对象引用,如创建一个对象引用他(new 对象)。只要处于此种引用,该对象就表示永远不会处于不可及状态,GC就不会回收他,即使JVM内存空间不足,JVM宁愿抛OutOfMemoryError运行时错误(OOM),让程序异常终止,也不会靠回收强引用对象来解决内存不足的问题。

软引用:

(1)软引用在内存足够的时候,GC不会回收它。 只有当JVM认定内存空间不足时才会去回收软引用指向的对象。软引用通常可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,java虚拟机就会把这个软引用加入到与之关联的引用队列中(详见下面的示例)。

(2)JVM会确保在抛出内存溢出(OOM)前清理软引用指向的对象,他会尽可能优先回收长时间闲置不用的软引用指向的对象,对那些刚构建的或刚使用过的软引用指向的对象尽可能的保留。基于软引用的这些特性,软引用可以用来实现很多内存敏感点的缓存场景(如图片缓存和网页缓存),即如果内存还有空闲,可以暂时缓存一些业务场景所需的数据,当内存不足时就可以清理掉,等后面再需要时,可以重新获取并再次缓存。这样就确保在使用缓存提升性能的同时,不会导致耗尽内存。

弱引用:

(1)GC在扫描它所管辖的内存区域时,只要发现弱引用的对象,不管内存空间是否有空闲,都会立刻回收它。 是一种十分临近finalize状态的情况,当弱引用被清除的时候,就符合finalize的条件了。弱引用与软引用最大的区别就是弱引用比软引用的生命周期更短暂。

(2)具体的回收时机还是要看垃圾回收策略的,并且垃圾回收器是一个优先级很低的线程,因此那些弱引用的对象并不是说只要达到弱引用状态就会立马被回收。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

虚引用:

(1)虚引用在任何时候都可能被GC回收,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,并且虚引用并不会决定对象的生命周期。

(2)虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用,也有人利用虚引用监控对象的创建和销毁。幻象引用的get方法永远返回null,主要用于检查对象是否已经从内测中删除。

参考链接:https://blog.csdn.net/weixin_41133233/article/details/103789929



推荐阅读
author-avatar
KellylikePchy_224
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有