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 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...