StackOverFlow & OutOfMemory

两者都为 Error,广义上的“异常”

StackOverflow

通常为 Java 虚拟机栈内存不够,JVM 对方法栈只有入栈和出栈的操作,所以在此处要报异常,让方法一直加入到方法栈中,而不出栈,将栈爆满,即可报异常。

举个栗子(最简单的栗子,无限递归)

public class StackErrorTest {

    private static int count = 0;

    public static void main(String[] args) {
System.out.println(count++);
main(args);
} }

可以通过增加栈内存来解决部分问题,但不是长久解决方法,还是得优化代码。(-Xss1024m)(不建议设置太大,一般1M即可)栈大小设置

OOM

oom(java.lang.OutOfMemoryError)

Java heap space

和 StackOverflow 类似,JVM 堆空间不足,对象实例及数组几乎都放在堆空间中,所以可以一直加新的对象让堆空间爆满。

举个栗子

import java.util.ArrayList;
import java.util.List; public class OOMTest { public static void main(String[] args) {
List<O> list = new ArrayList<>();
while (true){
list.add(new O(1024*1024*1024));
System.out.println(list.size());
}
} } class O{
private byte[] bs;
public O(int length){
this.bs = new byte[length];
}
}

同理,可以增加堆空间暂时解决问题 -Xms10240m -Xmx10240m

  • -Xms 设置堆空间的初始内存大小 默认为内存 1/64
  • -X 是jvm的运行参数
  • ms memory start
  • -Xmx 设置堆空间最大内存大小 默认为内存 1/4

MetaSpace(jdk8及以上)

属于元空间内存不够,元空间主要存放类信息,在加载过多的类会触发该报错,但在 jdk8 中方法区(8之后叫元空间)采用本地内存,最大值为本地运行内存大小,所以一般不会触发该报错。

修改元空间大小来触发报错

  • -XX:MetaspaceSize=10m
  • -XX:MaxMetaspaceSize=10m

设置初始大小为 10m,设置最大元空间大小为10m

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class JavaMethodAreaOOM { public static void main(String[] args) {
while (true){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,objects);
}
});
enhancer.create();
}
} static class OOMObject{} }

Direct buffer memory

本地直接内存不足,该内存不使用堆内存,不代表本地直接内存无限大,由于系统内存大小受限,所以本地内存和堆内存总和是有限制的,默认与堆内存大小一致

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List; public class OOM2 { public static void main(String[] args) {
int buffer = 1024 * 1024 * 100; //100M
List<ByteBuffer> list = new ArrayList<>();
int count = 0;
try {
while (true){
ByteBuffer direct = ByteBuffer.allocateDirect(buffer);
list.add(direct);
count++;
}
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println(count);
}
} }

StackOverFlow & OutOfMemory的更多相关文章

  1. (转)堆和栈的概念和区别 HeapOutOfMemory和StackOverflow解释

    转:https://blog.csdn.net/pt666/article/details/70876410 https://blog.csdn.net/guohan_solft/article/de ...

  2. 写了多年代码,你会 StackOverflow 吗

    写了多年代码,你会 StackOverflow 吗 Intro 准备写一个傻逼代码的系列文章,怎么写 StackOverflow 的代码,怎么写死锁代码,怎么写一个把 CPU 跑满,怎么写一个 Out ...

  3. 通过代码实现 `OutOfMemory

    通过代码实现 OutOfMemory Intro 来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 -- OutofMemory OutOfMemory Out ...

  4. .Net 4.5可执行程序OutOfMemory

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   产线上新部署的服务,发生几次无故停止的情况,通过系统事件看到是这样:   这个服务缓存了大量的数据,内存占用比 ...

  5. StackOverFlow排错翻译 - Python字符串替换: How do I replace everything between two strings without replacing the strings?

    StackOverFlow排错翻译 - Python字符串替换: How do I replace everything between two strings without replacing t ...

  6. Stackoverflow/dapper的Dapper-Extensions用法(二)

    之前翻译了Dapper-Extensions项目首页的readme.md,大家应该对这个类库的使用有一些了解了吧,接下来是wiki的文档翻译,主要提到了AutoClassMapper.KeyTypes ...

  7. Stackoverflow/dapper的Dapper-Extensions用法(一)

    Dapper-Extensions Dapper Extensions is a small library that complements Dapper by adding basic CRUD ...

  8. 无需FQ,自建本地CDN,秒上StackOverFlow!

    StackOverflow是一个面向程序员的技术问答平台.可是在不FQ的情况下,浏览StackOverflow是一件让人极不舒服的事情,常常需要等待数十秒页面才慢慢显示出来.本文我教大家一种能够流畅地 ...

  9. 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?

    转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...

  10. 泛函编程(29)-泛函实用结构:Trampoline-不再怕StackOverflow

    泛函编程方式其中一个特点就是普遍地使用递归算法,而且有些地方还无法避免使用递归算法.比如说flatMap就是一种推进式的递归算法,没了它就无法使用for-comprehension,那么泛函编程也就无 ...

随机推荐

  1. 【01】微服务(Microservice)是什么?为什么会出现微服务?

    微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念. 实际上,很多 SOA(面向服务的架构)实施成熟度比较好的企业,已经在使用和实施微服务了.只 ...

  2. 重新点亮shell————awk表达式[十二]

    前言 简单介绍一下awk命令. 正文 介绍: 字段: 实例: 例子: 分割例子: 显示行号例子: awk 表达式: 赋值操作符 这个$1 解释一下,在我们的脚本中,这个$1 是第一个参数,这里是第一个 ...

  3. docker 应用篇————docker安装[二]

    前言 这其实是去年的一篇blog,忘了写了.本来我想先发一下理论的,但是水平.... 正文 如果你不熟悉linux,而是使用windows,那么你可以这样下载windows桌面版或者说你在这之前完全不 ...

  4. 重新整理linux 系列 ——硬件的介绍(一)

    前言 打算重新整理linux,计划每天一更,希望能够按照计划执行吧. 正文 首先有一个疑惑,那就是一台手机是否是一台计算机? 来看下什么可以定义为一台计算机: 计算机为接收用户的输入,经由中央处理器的 ...

  5. Flask搭建APP统一管理平台

    主页效果: 1.从数据库中获取所有APP的信息,每个卡片上展示APP名称.bundle id.版本构建历史记录,系统类型等构建信息 2.支持查询筛选,模糊查询 3.点击历史记录跳转APP历史记录详情页 ...

  6. 深度|为什么一定要从DevOps走向BizDevOps?

    简介: 为更好地厘清波涛汹涌的数字化转型浪潮下软件产业所面对的机遇与挑战,6月29日,阿里云云效与阿里云开发者评测局栏目,联合特邀了InfoQ极客帮副总裁付晓岩.南京大学软件工程学院教授张贺.Thou ...

  7. 云原生时代如何用 Prometheus 实现性能压测可观测-Metrics 篇

    ​简介:可观测性包括 Metrics.Traces.Logs3 个维度.可观测能力帮助我们在复杂的分布式系统中快速排查.定位问题,是分布式系统中必不可少的运维工具. 作者:拂衣 什么是性能压测可观测 ...

  8. 创新推出 | Serverless 场景排查问题利器:函数实例命令行操作

    ​简介: 实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个"黑 ...

  9. What's new in dubbo-go v1.5.6

    简介: dubbogo 社区近期发布了 dubbogo v1.5.6.该版本和 dubbo 2.7.8 对齐,提供了命令行工具,并提供了多种加载配置的方式. 作者 | 铁城  dubbo-go 社区 ...

  10. [Contract] Solidity 多种访问控制 (Access Control) 实现方式

    在 solidity 中控制访问,一般是通过 modifier 修饰符方法来直接做. 那么对于稍复杂的多种访问控制,通常需要一个统一操作的模块化类库. 现在已经有了这样的类库存在,我们通过一个实现功能 ...