- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个在给定时间段内执行的 ScheduledThreadPoolExecutor。我实现了以下代码来检查内存泄漏或 GC 过载异常。当使用jvm参数-Xms4m -Xmx10m
运行此应用程序时,它会执行finally block 而不完成try block 语句。
我读了一篇article关于取消 SCHEDULEDFUTURES(内存泄漏)并尝试复制。
public class ThreadScheduling {
public static void main(String... args) throws Exception {
new Scheduling().run();
}
}
<小时/>
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.Date;
import java.util.concurrent.*;
public class Scheduling extends Thread {
public void run() {
start();
}
/**
* https://blog.kapsi.de/blog/canceling-scheduledfutures-memory-leak
*
* @param nameFormat
* @param useDaemonThreads
* @param poolSize
* @return
**/
public ScheduledThreadPoolExecutor scheduledExecutor(String nameFormat, boolean useDaemonThreads, int poolSize) {
final RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
final ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat(nameFormat)
.setDaemon(useDaemonThreads)
.build();
final ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(poolSize, threadFactory, handler);
return executor;
}
public void start() {
final ScheduledThreadPoolExecutor executor =
scheduledExecutor(" executor %s", false, 1);
executor.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
System.out.println(new Date() + " Going to execute service.");
String s = new String();
for(int i = 0; i < 100000; i++ )
{
s += "ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss" +
"ssssssssssssssssssssssssssssssssssss";
}
System.out.println(new Date() + " service completed.");
} catch (Exception ex) {
System.out.println(new Date() + " Error during executing services");
} finally {
executor.purge();
System.out.println(new Date() + " Finalize service.");
}
}
}, 2, 10, TimeUnit.SECONDS);
<小时/>
输出:
Mon Nov 27 19:22:55 IST 2017 Going to execute service.
Mon Nov 27 19:23:18 IST 2017 Finalize service.
ScheduledThreadPoolExecutor 如何在不完成 CPU 密集型任务的情况下执行 run 方法?
如果堆小于所需内存,GC 会自动管理所需内存。
在线程的每次定期执行中,ScheduledThreadPoolExecutor 是否会自动释放堆内存?
最佳答案
您遇到的问题是内存不足,这会触发 OutOfMemoryError,这不是异常。这意味着您看到的只是 finally
类的输出。
注意:在此代码中
executor.scheduleAtFixedRate(new Runnable() {
返回一个 Future
对象,它捕获任何未捕获的异常或错误。如果您放弃它,您将不会看到错误。
How ScheduledThreadPoolExecutor execute run method without completing the CPU bound task?
如果任务抛出错误或异常,它将完成但不会完成其任务。
GC automatically manage required memory, if the heap is less than the required memory.
并且它始终低于您设置的 10 MB 限制,这意味着如果您尝试超过此限制,它将抛出 OutOfMemoryError 。 (或者如果在某些情况下你离得太近)
Is heap memory automatically free by ScheduledThreadPoolExecutor in every periodic execution of thread?
GC运行时堆内存被释放,任何没有强引用的对象都可以被清理。
就您而言,您没有足够的内存来运行该任务一次,因此它会出错并且不会再次运行。
注意:您可以知道内存已释放,否则您将不会在 finally
block 中看到日志消息,因为这使用内存进行打印。如果没有可用内存,这将不起作用。
顺便说一句
executor.purge();
仅删除队列中已取消的任务。您的任务在运行时既不会被取消,也不会在队列中。
关于java - ScheduledThreadPoolExecutor线程run方法执行final block 而不完成try block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47513052/
ScheduledThreadPoolExecutor 扩展自 一文秒懂 Java 线程池之 ThreadPoolExecutor 讲解的 了ThreadPoolExecutor 类,并且添加了其它方
ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 是线程安全的吗?现在,我有一个场景如下: 5 ThreadPoolExecutor(s) exec1(
我有以下类(class) public class MaintanceTools { public static final ScheduledThreadPoolExecutor THREA
我需要更改 ScheduledThreadPoolExecutor 的运行任务的执行时间。 我有类似的东西 executor.schedule(new Runnable() {blablal},10,
我想要一些线程池,它每隔固定的时间运行一些任务(这个线程池一直在获取任务)。每个任务都会调用一些 API 来获取一些值,该值可以为 null。我希望仅当返回值为空时任务才再次运行(在固定时间后)。否则
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。请参阅SSCCE.o
我有一个具有固定延迟的任务,并且希望在 ScheduledThreadPoolExecutor 队列中只有一个任务。我的想法是使用 getQueue().isEmpty() 来检查队列中是否只有一个任
我如何将参数传递给 ScheduledThreadPoolExecutor? 我有以下代码。您会注意到,我声明了一个变量“num”,并将其作为参数传递给 exampleFunction()。 exam
假设我有这样的方法 public void scheduleCleanup(String parameter) { final SomeObject someObject = new Some
我知道由于各种原因我必须使用它而不是 java.util.Timer。所以,为了研究这个,我正在查看文档,我有几个问题: scheduleWithFixedDelay() 是如何工作的? 我的理解是:
例程 myProcessToRun() 需要执行 100 次,但每次执行之间需要大约一秒钟的延迟。 以下 FOR 循环与 ScheduledThreadPoolExecutor 对象结合使用。 for
ScheduledThreadPoolExecutor 中有两个属性具有以下 getter(以及随附的 setter) : boolean getContinueExistingPeriodicTas
这个问题只是为了对这些概念有一些想法,以了解业内人士将其用于什么目的。 如果您可以仅给出一些示例用法,我将不胜感激。我知道它们是如何工作的,并确实阅读了有关它们的google文档,但我似乎仍然很难选择
所有可用的 ScheduledThreadPoolExecutor 构造函数都需要一个 corePoolsize 参数。但我不确定我实际需要多少? 我计划在一个类中使用它,其中一个实例仅使用 1 个计
我正在尝试在 scala play 框架中实现预定作业。 以下是我的代码: def subCron = { val task = new Runnable { def run() = {
ScheduledThreadPoolExecutor 的文档说 -安排在完全相同执行时间的任务以先进先出 (FIFO) 的提交顺序启用。 这是否意味着应该同时完成的任务永远不会同时完成。相反,它们以
我有这个简单的代码片段: /** * @param args the command line arguments */ public static void main(String[] args
我写了下面的代码: import java.util.Calendar; import java.util.concurrent.ScheduledThreadPoolExecutor; import
如果我使用ThreadPoolExecutor,我有多种构造函数,我可以为池的工作队列传递/使用我自己的队列。 现在我看到 ScheduledThreadPoolExecutor 是 ThreadPo
我正在阅读 ScheduledThreadPoolExecutor JavaDoc并遇到了以下事情: Delayed tasks execute no sooner than they are ena
我是一名优秀的程序员,十分优秀!