`

Exception 和 stack 溢出

 
阅读更多

如果我们程序中有太多关于exception 的处理,就有可能引起

 
Exception in thread "main" java.lang.StackOverflowError
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)

分享到:
评论

相关推荐

    windows 缓冲区溢出

    4. **GS(Guarded Stack)**:在栈帧中添加一个安全cookie,用于检测栈溢出。如果cookie被修改,程序将终止。 三、缓冲区溢出的突破技巧 尽管有这些保护机制,攻击者仍然可以寻找漏洞绕过防护。常见的方法包括: ...

    易语言源码,编写自己的OD

    判断 Exception pExceptionRecord ExceptionCode = 十六到十 #Exception Stack OverFlow &quot; 线程堆栈溢出 越界 加入调试信息 “线程堆栈溢出 越界” 判断 Exception pExceptionRecord ExceptionCode = ...

    栈溢出攻击技术 windows linux下的都有

    随后,Aleph One在1996年的《Smashing the Stack for Fun and Profit》中详细介绍了栈溢出的原理,极大地推动了该领域的研究。1998年,Dildog提出了利用栈指针的方法来控制程序跳转,而1999年Dark Spyrit则展示了...

    introduction to WINCE exception

    本文将对WinCE中的几种主要异常类型进行深入解析,包括数据异常(Data Abort)、预取异常(Prefetch Abort)和栈故障(Stack Fault),以及如何通过RAISE EXCEPTION来处理异常。 首先,我们来看数据异常。当处理器...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,就会抛出`OutOfMemoryError: Java heap space`。 1. **调整JVM堆大小**:可以...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    在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?

    在编程中,`StackOverflowException` 是一个非常特殊且具有破坏性的异常,它通常发生在程序的堆栈空间耗尽时。在C#中,当一个递归调用没有正确的退出条件,...通过添加适当的检查和限制,可以确保程序的稳定性和效率。

    jvm内存溢出解决方法(jvm内存溢出怎么解决)

    JVM的内存结构可以分为三个部分:堆(Heap)、栈(Stack)和永久代(PermGen)。堆是JVM用来存放对象的区域,而栈是JVM用来存放方法调用和局部变量的区域。永久代则是JVM用来存放类和类描述的区域。 现在,让我们来...

    Runtime-Exception-Rams

    在Java中,内存分为堆内存(Heap)和栈内存(Stack)。栈主要存储基本类型和对象引用,而堆存储对象实例。当程序创建对象时,对象会分配在堆上,而引用会被放在栈上。如果程序创建大量对象或长时间持有对象引用,...

    jvm工作原理资料

    2. **内存区域**:JVM内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)五部分。堆是所有线程共享的内存区域,用于存放...

    Exploit 编写系列教程第三篇_基于SEH的Exploit

    在实际操作中,可能还需要考虑其他因素,例如堆栈保护(Stack Canaries)和非执行堆栈(NX Bit),这些都会增加编写exploit的难度。此外,现代操作系统和编译器的防护措施也在不断升级,攻击者必须不断创新和适应。 ...

    Senior.Design.VC.stack.pop.rar_Windows编程_Visual_C++_

    7. **递归和堆栈溢出**:递归调用会使用堆栈空间,过多的递归可能导致堆栈溢出。开发者应监控递归深度,必要时改用迭代或其他数据结构。 8. **模板和泛型编程**:在VC++中,使用模板可以使堆栈类支持多种数据类型。...

    Java 技术面试题

    12. **error 和 exception**:Error 是系统级别的问题,通常无法恢复,如内存溢出;Exception 是程序运行时出现的异常情况,可以通过捕获和处理恢复。 13. **同步和异步**:同步意味着一个任务完成后才能执行下一个...

    java面试题的几个区别

    在Java中,`Error`和`Exception`都属于`Throwable`类的子类,但它们的使用和处理方式有本质的区别: - `Error`通常表示应用程序无法处理的严重问题,这些问题通常是系统级错误或资源耗尽,例如内存溢出或堆栈溢出。...

    VxWorks系统异常分析方法.docx

    - **使用`checkStack`命令**:检查堆栈溢出情况,如果发现溢出,需要进一步调查。 - **使用`tt`命令**:查看任务调用栈,分析函数调用序列,寻找问题根源。 - **检查全局变量**:特别是指针和数组,看是否有任务抢占...

    Accelerated Linux Core Dump Analysis Training Course

    - 栈溢出(Stack Overflow):当程序尝试在栈上分配过多的数据时,导致栈内存溢出。 - C++异常(C++ Exception):C++程序中引发的异常没有被正确捕获和处理。 - 局部缓冲区溢出(Local Buffer Overflow):在函数...

    WPF崩溃重启

    在Windows Presentation Foundation(WPF)应用开发中,有时由于各种原因,如内存溢出、未捕获的异常或系统资源耗尽,应用程序可能会突然崩溃。这种情况对于用户来说是不理想的,因为它中断了他们的工作流程。为了...

    Exploitation

    ##### 堆栈溢出(Stack-Based Buffer Overflows) 堆栈溢出是一种常见的漏洞利用技术,它通常发生在程序将过多的数据写入到一个固定大小的缓冲区时。当数据超过缓冲区容量时,会覆盖堆栈上相邻的内存空间,包括返回...

Global site tag (gtag.js) - Google Analytics