线程池OOM错误

2023-10-27

1、LinkedBlockingQueue报错

package com.spring.pro.threadpool.completableFuture.youhua.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import lombok.extern.slf4j.Slf4j;

/**
 * @Title: ExecutorsDemo.java
 * @ProjectName com.spring.pro.threadpool
 * @Description:
 * @author ybwei
 * @date 2020年1月3日 下午7:26:22
 */
@Slf4j
public class ThreadPoolTest {

	public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(5);
		for (int i = 0; i < Integer.MAX_VALUE; i++) {
			executor.execute(() -> {
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					log.info("线程错误:", e);
				}
			});
		}
	}
}

JVM参数-Xmx5m -Xms5m

异常:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.concurrent.LinkedBlockingQueue.offer(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source)
	at com.spring.pro.threadpool.completableFuture.youhua.test.ThreadPoolTest.main(ThreadPoolTest.java:22)

OOM描述:

JVM抛出 java.lang.OutOfMemoryError: GC overhead limit exceeded 错误就是发出了这样的信号: 执行垃圾收集的时间比例太大, 有效的运算量太小. 默认情况下, 如果GC花费的时间超过 98%, 并且GC回收的内存少于 2%, JVM就会抛出这个错误。

OOM原因:

newFixedThreadPool中创建的LinkedBlockingQueue,是无界队列。不断向队列添加任务就会导致内存溢出。

2、ArrayBlockingQueue报错

上面的例子只是造成OOM的一个demo,实际上

package com.spring.pro.threadpool.completableFuture.test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import lombok.extern.slf4j.Slf4j;

/**
 * @Title: CompletableFutureTest.java
 * @ProjectName com.spring.pro.threadpool
 * @Description:
 * @author ybwei
 * @date 2020年1月3日 下午4:29:25
 */
@Slf4j
public class CompletableFutureTest {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ArrayBlockingQueue<Runnable> arrayWorkQueue = new ArrayBlockingQueue<>(400000);
		ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, // corePoolSize线程池中核心线程数
				10, // maximumPoolSize 线程池中最大线程数
				60, // 线程池中线程的最大空闲时间,超过这个时间空闲线程将被回收
				TimeUnit.SECONDS, // 时间单位
				// 下面是采用有界队列和无界队列的区别
				arrayWorkQueue,
				// linkedWorkQueue,

				// 下面是jdk的四种执行策略
				// new ThreadPoolExecutor.AbortPolicy() 这种策略直接抛出异常,丢弃任务。
				// new ThreadPoolExecutor.DiscardPolicy() 这种策略和AbortPolicy几乎一样,也是丢弃任务,只不过他不抛出异常。
				new ThreadPoolExecutor.CallerRunsPolicy() // 线程调用运行该任务的 execute,调用者运行者
		// 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。没看明白,当时是我的main线程执行的task5
//				new ThreadPoolExecutor.DiscardOldestPolicy()// 如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)
		);
		
		log.info("线程开始");
		handle(threadPool);
		log.info("线程结束");
	}

	/**  
	 * @Description: 
	 * @param threadPool
	 * @Author: ybwei
	 * @Date: 2020年1月3日 下午7:43:56
	 */ 
	private static void handle(ThreadPoolExecutor threadPool) {
		for(int i=0;i<Integer.MAX_VALUE;i++) {
			CompletableFuture.runAsync(() -> {
				try {
					log.info("运行开始");
					TimeUnit.SECONDS.sleep(10);
					log.info("运行结束");
				} catch (InterruptedException e) {
				}
				log.info("run end ...");
			},threadPool);
		}
	}
}

JVM参数-Xmx5m -Xms5m,依然会报OOM。因为队列太长了new ArrayBlockingQueue<>(400000)。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程池OOM错误 的相关文章

  • JSON - 使用Gson反序列化动态对象

    假设我有一个以下类型的 Java 类 public class MyClass public String par1 public Object par2 然后我有这个 String json par1 val1 par2 subpar1
  • H2 - 多个应用程序访问同一个 H2 数据库

    我正在使用嵌入式数据库H2在 2 个网络应用程序中说WebApp1 and WebApp2 我运行 WebApp1 并执行一些查询来访问 H2 数据库 同时我运行 WebApp2 但它抛出异常H2 当前已被另一个进程使用 我的需求是 我应该
  • java.lang.unsatisfiedlinkerror 无法加载 amd 64 位 .dll ia 32 位

    当我尝试在 Eclipse 上运行我的项目时 出现以下错误 它在我开发它的计算机上运行良好 但当我将其导入我的笔记本电脑时 它不起作用 这个问题已经在本网站的其他地方提出过 这个问题的主要原因似乎是环境变量设置不正确 但我检查过 它们似乎是
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • 将对象列表传递给 Freemarker 然后循环

    我已经熟悉了 FreeMarker 一个 Java 模板引擎 我已经能够通过哈希映射将对象传递给模板引擎了 这样就可以了 但是 一旦我尝试将任何类型的多个对象集传递给 FreeMarker 它就会给我一个 freemarker templa
  • Spring 可以理解 @Inject 替换 Weld 作为 JSR-299 实现吗?

    我从几个网页中注意到 Spring 3 0 显然支持来自 JSR 330 的 Inject 由于我们确实希望在 Web 应用程序和独立应用程序的库中使用 JSR 299 语法进行依赖项注入 并且有 Weld 的替代方案 因此如果 Sprin
  • Android 背景 + 文本 + 按钮图标

    我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • Spark toLocalIterator 和迭代器方法之间的区别

    在编写 Spark 程序时我遇到了这个toLocalIterator 方法 之前我只使用iterator method 如果有人曾经使用过这种方法 请点亮 我在使用时遇到foreach and foreachPartitionSpark程序
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • 为什么 Libgdx 的 Table 不接受缩放操作?

    我在 libgdx 库中使用 scene2d 在游戏中创建一些 UI 我使用了一个表格 我想在用户触摸时采取一些缩放操作以使按钮触摸有意义 当我使用任何其他 Actor 类型 例如 Group 并为其提供缩放操作时 它可以工作 但不能工作表
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • 如何在其他窗口之上生成独立的 JFileChooser 对话框?

    Like 其他一些人 https stackoverflow com questions 4161207 javavm windows 7 64bit jfilechooser not showing dialog box谁问过类似的问题
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • 如果可能,将 jFrame 输出到第二台显示器

    我在 Java 中的 Swing 上有一个 jFrame 我希望它输出到第二个监视器 如果该监视器存在 我尝试过这个 通过this http download oracle com javase 6 docs api java awt Gr
  • 使用 JPA 和 Hibernate 时 DISTINCT 如何工作

    DISTINCT 在 JPA 中使用什么列 是否可以更改它 以下是使用 DISTINCT 的 JPA 查询示例 select DISTINCT c from Customer c 这没有多大意义 不同的列是基于哪一列 它是否在实体上指定为注
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • 2.6 内核 tasklet 和workqueue 的区别

    work queue 跟tasklet 不同 1 work queue 运行环境的是内核线程 所以可以休眠 可以分配内存 获得信号量 执行阻塞I O 2 tasklet 的运行环境是软中断 所以不能休眠 3 tasklet的使用跟timer
  • 串口异步通信——时序宽度测试

    一般情况下串口 bit 1 与 bit 0 宽度能基本维持对等 脉宽接近 把串口 0x55 理解为一个占空比为50 的方波 在占空比接近50 的情况下 通信一般不会出现错误 但是 在一些脉宽有损失的场景中 则非常需要注意脉冲宽度要求 使用波
  • Unity中射线Ray和RaycastHit的简单介绍

    射线是在三维世界中从一个点沿一个方向发射的一条无限长的线 在射线的轨迹上 一旦与添加了碰撞器的模型发生碰撞 将停止发射 我们可以利用射线实现子弹击中目标的检测 鼠标点击拾取物体等功能 1 Physics Raycast public sta
  • pycharm修改快捷键

    pycharm修改快捷键 很多使用使用pythcharm的同学 如果想运行程序 通常需要 第一步右键 第二步 选择运行或者直接点击运行 但是往往厉害的程序员 一般直接键盘操作 如果你使用pycharm自带的快捷键 需要按下 Ctrl Shi
  • Python3 使用 selenium 获取 JS 代码里边的变量值

    from selenium import webdriver driver webdriver Ie r IEDriverServer exe 找一个合适版本的IEDriver js var hello hello world return
  • C语言实验——大小写转换oj1168

    C语言实验 大小写转换 Time Limit 1000ms Memory limit 65536K 有疑问 点这里 题目描述 把一个字符串里所有的大写字母换成小写字母 小写字母换成大写字母 其他字符保持不变 输入 输入为一行字符串 其中不含
  • 数据结构与算法 -- 基础篇

    本文主要用于记录学习过程中的一些总结 适用于一些刚学习数据结构和算法的同学 能够给予一些概括性认识 而且从下面的一些算法题中能够获得一些对于算法题目常用解题思路 如果能够对你有些帮助 是我之幸 接下来 将一共分为三部分来介绍如下内容 1 基
  • ElasticSearch 数据迁移方案

    一个人不论赋有什么样的棋 他如果不知道自己有这种棋 并且不形成适合于自己棋的计划 那种棋对他便完全无用 休漠 ElasticSearch 常用api ElasticSearch 版本说明 name node 3 cluster name t
  • python3 题解(10)打印金字塔1

    打印金字塔1 问题 用星号在控制台上输出一个金字塔的形状 可以看出 它的第n行的星号的个数是 2 n 1 这个问题的思路可以很多 比如 先造出指定数目的星号 再计算出前后补的空格数 这里采用如下的思路 已知了n 最后一行的星号的数目就固定了
  • 杭电ACM-A+B problem

    topic Calculate A B Input Each line will contain two integers A and B Process to end of file Output For each case output
  • QT QDockWidget 重叠方法

    主要通过如下红色代码的方法实现 效果图片如下 代码如下 void MainWindow createDockWindows QDockWidget dock new QDockWidget tr Customers this dock gt
  • curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

    MacOS系统使用 Homebrew 官方地址时 报错 Mac安装homebrew的时候报错 Mac bin bash c curl fsSL https raw githubusercontent com Homebrew install
  • 自定义openwrt的配置界面:luci进阶之路

    5 20 晴 今天的太阳挺大的 晒得我进园区直接37 3警告 于是我百度搜索微信朋友圈怎么关闭 才把温度稳定下来 算了算了 上班说事 由于公司部门调动 逐渐接触到新的知识 新的模块 还听说这玩意比较冷门 没办法 该搞还是得搞 又不是搞不了
  • 渗透测试技术----常见web漏洞--命令执行原理及防御

    一 命令执行漏洞介绍 1 命令执行漏洞简介 命令执行漏洞时指服务器没有对执行的命令进行过滤 用户可以随意执行系统命令 命令执行漏洞属于高危漏洞之一 也属于代码执行的范围内 2 命令执行漏洞的原理 应用程序有时需要调用一些执行系统命令的函数
  • 嵌入式AI助力当代商业的发展

    数字化转型的业务影响是广泛的 但购买者应寻求嵌入式AI在以下领域具有最大的影响力 1 业务流程和任务的自动化 当买家搜索购买包含AI的软件时 他们应该研究该解决方案为员工自动执行日常任务的方式 嵌入式AI应该节省员工的时间和精力 以便他们可
  • 华为文稿演示服务器操作异常修复,修复服务器

    修复服务器 内容精选 换一换 安装Agent插件后 修复插件配置为用户提供了一键配置AK SK RegionID ProjectId的功能 省去了繁琐的手动配置步骤 提升配置效率 目前大部分区域已上线一键式授予该区域插件权限功能 即自动修复
  • java编码 第一次

    这是java的快速入门 演示java的开发步骤 对代码的相关说明 1 public class Hello 表示Hello是一个类 是一个public公有的类 2 Hello 表示一个类的开始和结束 3 public static void
  • java循环while之等差数列均值_java基础_while 循环语句的定义及用法

    一 while 循环语句的定义 在 C 语言中 while 循环是除了 for 循环外最常用的循环语句 相对于 for 循环而言 while 循环更多地应用于循环次数未定的循环控制中 while 循环的一般表达形式为 while 表达式 循
  • 色温

    色温是表示光线中包含颜色成分的一个计量单位 从理论上说 黑体温度指绝对黑体从绝对零度 273 开始加温后所呈现的颜色 黑体在受热后 逐渐由黑变红 转黄 发白 最后发出蓝色光 当加热到一定的温度 黑体发出的光所含的光谱成分 就称为这一温度下的
  • 线程池OOM错误

    1 LinkedBlockingQueue报错 package com spring pro threadpool completableFuture youhua test import java util concurrent Exec