gpt4 book ai didi

java - ScheduledThreadPoolExecutor线程run方法执行final block 而不完成try block

转载 作者:行者123 更新时间:2023-12-02 11:57:21 30 4
gpt4 key购买 nike

我正在创建一个在给定时间段内执行的 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com