StackOverFlow & OutOfMemory
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的更多相关文章
- (转)堆和栈的概念和区别    HeapOutOfMemory和StackOverflow解释
		
转:https://blog.csdn.net/pt666/article/details/70876410 https://blog.csdn.net/guohan_solft/article/de ...
 - 写了多年代码,你会 StackOverflow 吗
		
写了多年代码,你会 StackOverflow 吗 Intro 准备写一个傻逼代码的系列文章,怎么写 StackOverflow 的代码,怎么写死锁代码,怎么写一个把 CPU 跑满,怎么写一个 Out ...
 - 通过代码实现 `OutOfMemory
		
通过代码实现 OutOfMemory Intro 来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 -- OutofMemory OutOfMemory Out ...
 - .Net 4.5可执行程序OutOfMemory
		
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 产线上新部署的服务,发生几次无故停止的情况,通过系统事件看到是这样: 这个服务缓存了大量的数据,内存占用比 ...
 - 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 ...
 - Stackoverflow/dapper的Dapper-Extensions用法(二)
		
之前翻译了Dapper-Extensions项目首页的readme.md,大家应该对这个类库的使用有一些了解了吧,接下来是wiki的文档翻译,主要提到了AutoClassMapper.KeyTypes ...
 - Stackoverflow/dapper的Dapper-Extensions用法(一)
		
Dapper-Extensions Dapper Extensions is a small library that complements Dapper by adding basic CRUD ...
 - 无需FQ,自建本地CDN,秒上StackOverFlow!
		
StackOverflow是一个面向程序员的技术问答平台.可是在不FQ的情况下,浏览StackOverflow是一件让人极不舒服的事情,常常需要等待数十秒页面才慢慢显示出来.本文我教大家一种能够流畅地 ...
 - 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
		
转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...
 - 泛函编程(29)-泛函实用结构:Trampoline-不再怕StackOverflow
		
泛函编程方式其中一个特点就是普遍地使用递归算法,而且有些地方还无法避免使用递归算法.比如说flatMap就是一种推进式的递归算法,没了它就无法使用for-comprehension,那么泛函编程也就无 ...
 
随机推荐
- Hive设置map和reduce数量
			
一.控制hive任务中的map数: 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为1 ...
 - sql 语句系列(月份的第一天和最后一天)[八百章之第二十章]
			
前言 插播一个,从给定日期值里面提取年月日时分秒. 之所以写这个是因为使用频率太高. mysql: select DATE_FORMAT(CURRENT_TIMESTAMP,'%k') hr, DAT ...
 - 用fpga实现1G Eth TCP&UDP硬件协议栈
			
用fpga实现的1G 以太网硬件协议栈,属于轻的协议栈
 - git fork 项目的更新
			
fork:github网站的操作,将开源项目复制一份到自己的仓库中 那fork的项目在原仓库更新后,如何同步呢? 1.查看远程仓库 $ git remote -v origin https://cod ...
 - Node.js 中的事件循环机制
			
一.是什么 在浏览器事件循环中,我们了解到javascript在浏览器中的事件循环机制,其是根据HTML5定义的规范来实现 而在NodeJS中,事件循环是基于libuv实现,libuv是一个多平台的专 ...
 - 教你如何进行Prometheus 分片自动缩放
			
本文分享自华为云社区<使用 Prometheus-Operator 进行 Prometheus + Keda 分片自动缩放>,作者: Kubeservice@董江. 垂直缩放与水平缩放 P ...
 - 力扣560(java&python)-和为k的子数组(中等)
			
题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . 示例 1: 输入:nums = [1,1,1], k = 2输出:2示例 2: 输入:n ...
 - 力扣217(java&python)-存在重复元素(简单)
			
题目: 给你一个整数数组 nums .如果任一值在数组中出现 至少两次 ,返回 true :如果数组中每个元素互不相同,返回 false . 示例 1: 输入:nums = [1,2,3,1]输出:t ...
 - [Blockchain] Cosmos Starport 101 - 为你的新数据类型 生成代码
			
# 项目模板 $ starport app github.com/hello/planet --address-prefix your_new_prefix 项目目录结构的说明看这里: https:/ ...
 - [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract
			
我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...