如果我们程序中有太多关于exception 的处理,就有可能引起
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Exception.<init>(Exception.java:66)
at java.lang.RuntimeException.<init>(RuntimeException.java:62)
at java.lang.Exception.<init>(Exception.java:66)
at java.lang.RuntimeException.<init>(RuntimeException.java:62)
因为Exception 的初始化和处理都有要对栈的操作,所以自然占栈的空间。
比如
public class ThreadTest {
public static void main(String[]args){
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(0, 1, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.AbortPolicy());
List<String> imagesForTask =new ArrayList<String>();
for(int i=0;i<100000;i++){
imagesForTask.add("aaa");
}
scanRegistryImage(threadPool,0,imagesForTask);
}
private static void scanRegistryImage(final ThreadPoolExecutor threadPool,int idx, List<String> imagesForTask) {
if (idx >= imagesForTask.size()) {
return;
}
int current = idx;
try {
for (; current < imagesForTask.size(); current++) {
System.out.println("current task :" + current + " is prepared to goin pool.");
threadPool.execute(new ScanImageTask());
System.out.println("current task :" + current + " is ok to goin pool.");
}
} catch (RejectedExecutionException e) {
try {
Thread.sleep(1);
System.gc(); //如果这行不加,就会有栈溢出。
System.out.println("scanRegistryImage has RejectedExecutionException with " + current + " so wait seconds, will do in next loop.");
System.out.println("getActiveCount :"+threadPool.getActiveCount());
System.out.println("getPoolSize :"+threadPool.getPoolSize());
System.out.println("getTaskCount :"+threadPool.getTaskCount());
scanRegistryImage(threadPool, current, imagesForTask);
} catch (Exception e1) {
e1.printStackTrace();
}
}catch (Exception e) {
e.printStackTrace();
return;
}
}
}
public class ScanImageTask implements Runnable, Serializable { @Override public void run() { try { System.out.println("ScanImageTask start ##########################################################################################"); Thread.sleep(100); System.out.println("ScanImageTask end ##########################################################################################"); } catch (Exception e) { e.printStackTrace(); } } }
如果没有这行 System.gc(); 程序运行一半就会奔溃退出。
current task :86 is prepared to goin pool.
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Exception.<init>(Exception.java:66)
at java.lang.RuntimeException.<init>(RuntimeException.java:62)
at java.util.concurrent.RejectedExecutionException.<init>(RejectedExecutionException.java:64)
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
相关推荐
4. **GS(Guarded Stack)**:在栈帧中添加一个安全cookie,用于检测栈溢出。如果cookie被修改,程序将终止。 三、缓冲区溢出的突破技巧 尽管有这些保护机制,攻击者仍然可以寻找漏洞绕过防护。常见的方法包括: ...
判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Stack OverFlow " 线程堆栈溢出 越界 加入调试信息 “线程堆栈溢出 越界” 判断 Exception pExceptionRecord ExceptionCode = ...
随后,Aleph One在1996年的《Smashing the Stack for Fun and Profit》中详细介绍了栈溢出的原理,极大地推动了该领域的研究。1998年,Dildog提出了利用栈指针的方法来控制程序跳转,而1999年Dark Spyrit则展示了...
本文将对WinCE中的几种主要异常类型进行深入解析,包括数据异常(Data Abort)、预取异常(Prefetch Abort)和栈故障(Stack Fault),以及如何通过RAISE EXCEPTION来处理异常。 首先,我们来看数据异常。当处理器...
Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,就会抛出`OutOfMemoryError: Java heap space`。 1. **调整JVM堆大小**:可以...
在Java中,这主要与JVM(Java虚拟机)的内存模型有关,该模型包括堆(Heap)、栈(Stack)、方法区(Method Area)和程序计数器(PC Register)等几个区域。当堆或方法区的内存耗尽时,就会抛出`OutOfMemoryError`。...
raise Exception("Stack is empty.") value = self.stack[self.top] self.stack[self.top] = None self.top -= 1 return value def peek(self): if self.is_empty(): raise Exception("Stack is empty.") ...
在编程中,`StackOverflowException` 是一个非常特殊且具有破坏性的异常,它通常发生在程序的堆栈空间耗尽时。在C#中,当一个递归调用没有正确的退出条件,...通过添加适当的检查和限制,可以确保程序的稳定性和效率。
JVM的内存结构可以分为三个部分:堆(Heap)、栈(Stack)和永久代(PermGen)。堆是JVM用来存放对象的区域,而栈是JVM用来存放方法调用和局部变量的区域。永久代则是JVM用来存放类和类描述的区域。 现在,让我们来...
在Java中,内存分为堆内存(Heap)和栈内存(Stack)。栈主要存储基本类型和对象引用,而堆存储对象实例。当程序创建对象时,对象会分配在堆上,而引用会被放在栈上。如果程序创建大量对象或长时间持有对象引用,...
2. **内存区域**:JVM内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)五部分。堆是所有线程共享的内存区域,用于存放...
在实际操作中,可能还需要考虑其他因素,例如堆栈保护(Stack Canaries)和非执行堆栈(NX Bit),这些都会增加编写exploit的难度。此外,现代操作系统和编译器的防护措施也在不断升级,攻击者必须不断创新和适应。 ...
7. **递归和堆栈溢出**:递归调用会使用堆栈空间,过多的递归可能导致堆栈溢出。开发者应监控递归深度,必要时改用迭代或其他数据结构。 8. **模板和泛型编程**:在VC++中,使用模板可以使堆栈类支持多种数据类型。...
12. **error 和 exception**:Error 是系统级别的问题,通常无法恢复,如内存溢出;Exception 是程序运行时出现的异常情况,可以通过捕获和处理恢复。 13. **同步和异步**:同步意味着一个任务完成后才能执行下一个...
在Java中,`Error`和`Exception`都属于`Throwable`类的子类,但它们的使用和处理方式有本质的区别: - `Error`通常表示应用程序无法处理的严重问题,这些问题通常是系统级错误或资源耗尽,例如内存溢出或堆栈溢出。...
- **使用`checkStack`命令**:检查堆栈溢出情况,如果发现溢出,需要进一步调查。 - **使用`tt`命令**:查看任务调用栈,分析函数调用序列,寻找问题根源。 - **检查全局变量**:特别是指针和数组,看是否有任务抢占...
- 栈溢出(Stack Overflow):当程序尝试在栈上分配过多的数据时,导致栈内存溢出。 - C++异常(C++ Exception):C++程序中引发的异常没有被正确捕获和处理。 - 局部缓冲区溢出(Local Buffer Overflow):在函数...
在Windows Presentation Foundation(WPF)应用开发中,有时由于各种原因,如内存溢出、未捕获的异常或系统资源耗尽,应用程序可能会突然崩溃。这种情况对于用户来说是不理想的,因为它中断了他们的工作流程。为了...
##### 堆栈溢出(Stack-Based Buffer Overflows) 堆栈溢出是一种常见的漏洞利用技术,它通常发生在程序将过多的数据写入到一个固定大小的缓冲区时。当数据超过缓冲区容量时,会覆盖堆栈上相邻的内存空间,包括返回...