zoukankan      html  css  js  c++  java
  • 写Java代码分别使堆溢出,栈溢出

    首先要搞清楚堆栈里放的什么东西:

    栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间,堆分配每一个对象内容(实例)内存空间。

    一个变量可以先后指向多个对象实例;数组、链表等可以存放对多个实例对象内容的引用关系。没有引用关系的对象内容按说被虚拟机回收(recycled,destroy,在C++叫delete,在C叫free)。 栈的实现是先入后出的, 相似的集装箱那种货舱。 堆是随机存放的, 相似于现在的停车场。 记得曾经,有一本游戏的外国书, 说游戏要分配好栈空间和堆空间; 在开始时候分配固定容量的空间, 有不同的自顶向下和从下向上的地址空间分配。

    stackoverflow , 总是在无限递归调用时候可以看见(google也经常有同名网站的结果)。

    堆内存满, 可以通过无限new实现。

    ======================华丽的分隔符================================

    在JAVA中,可以使用关键字new来创建Java对象。例如,

    ArrayList list = new ArrayList();

    实际上,在创建完上面的一个对象后,在JVM中,会把new出来的对象存放在堆内存中,

    同时,在方法栈中存放着对象的引用关系。

    如果想要堆溢出,比较简单,可以循环创建对象或大的对象;

    如果想要栈溢出,可以递归调用方法,这样随着栈深度的增加,JVM 维持着一条长长的方法调用轨迹,

    直到内存不够分配,产生栈溢出。

    因此,可以使用下面简单的代码实现堆溢出和栈溢出。

    复制代码
    public class Test {
    
        public void testHeap(){
            for(;;){
                  ArrayList list = new ArrayList (2000);
              }
        }
        int num=1;
        public void testStack(){
            num++;
            this.testStack();
         }
        
        public static void main(String[] args){
            Test  t  = new Test ();
            t.testHeap();
            t.testStack();   
        }
    }
    复制代码

    另外,Java虚拟机的堆大小如何设置:命令行

     java –Xms128m //JVM占用最小内存

               –Xmx512m //JVM占用最大内存

               –XX:PermSize=64m //最小堆大小

               –XX:MaxPermSize=128m //最大堆大小

  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/MJyc/p/10408222.html
Copyright © 2011-2022 走看看