ScheduledThreadPoolExecutor线程运行方法执行final块而不完成try块
ScheduledThreadPoolExecutor thread run method execute final block without completing the try block
我正在创建一个在给定时间段内执行的 ScheduledThreadPoolExecutor。我实现了以下代码来检查内存泄漏或 GC 过载异常。 运行使用 jvm 参数 -Xms4m -Xmx10m
连接此应用程序时,它执行 finally 块而没有完成 try 块语句。
我阅读了一篇关于取消 SCHEDULEDFUTURES(内存泄漏)的 article 并尝试复制。
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绑定任务?
如果堆小于所需内存,GC 会自动管理所需内存。
堆内存是否在每次周期性执行线程时由ScheduledThreadPoolExecutor自动释放?
您遇到的问题是 运行内存不足,这会触发 OutOfMemoryError,这不是异常。这意味着您所看到的只是 finally
class.
的输出
注意:在此代码中
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 运行s 时堆内存被释放,任何没有强引用的对象都可以被清理。
在你的情况下,你没有足够的内存来 运行 一次任务,所以它出错并且不会再次 运行。
注意:您可以判断内存已被释放,否则您将不会在 finally
块中看到日志消息,因为它使用内存进行打印。如果没有空闲内存,这将不起作用。
顺便说一句
executor.purge();
只删除队列中已取消的任务。您的任务在 运行ning 时既没有取消也没有在队列中。
你可以试试RuntimeException
。
catch (Exception ex)
System.out.println(new Date() + " Error during executing services");
catch (RuntimeException ex)
System.out.println(new Date() + " Error during executing services");
我正在创建一个在给定时间段内执行的 ScheduledThreadPoolExecutor。我实现了以下代码来检查内存泄漏或 GC 过载异常。 运行使用 jvm 参数 -Xms4m -Xmx10m
连接此应用程序时,它执行 finally 块而没有完成 try 块语句。
我阅读了一篇关于取消 SCHEDULEDFUTURES(内存泄漏)的 article 并尝试复制。
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绑定任务?
如果堆小于所需内存,GC 会自动管理所需内存。
堆内存是否在每次周期性执行线程时由ScheduledThreadPoolExecutor自动释放?
您遇到的问题是 运行内存不足,这会触发 OutOfMemoryError,这不是异常。这意味着您所看到的只是 finally
class.
注意:在此代码中
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 运行s 时堆内存被释放,任何没有强引用的对象都可以被清理。
在你的情况下,你没有足够的内存来 运行 一次任务,所以它出错并且不会再次 运行。
注意:您可以判断内存已被释放,否则您将不会在 finally
块中看到日志消息,因为它使用内存进行打印。如果没有空闲内存,这将不起作用。
顺便说一句
executor.purge();
只删除队列中已取消的任务。您的任务在 运行ning 时既没有取消也没有在队列中。
你可以试试RuntimeException
。
catch (Exception ex)
System.out.println(new Date() + " Error during executing services");
catch (RuntimeException ex)
System.out.println(new Date() + " Error during executing services");