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

    转自:http://fxlzs2000.iteye.com/blog/1786407

    转自:http://my.oschina.net/sdrkyj/blog/143410

    前言

    primitive type: 基本类型,像int、double就是。
    wrapped type:包装类型,int—>Integer,double—>Decimal

    基本类型跟就是不可实例化的,可以直接初始化、赋值、运算。不可调用方法,不可放入容器(要求必须是类实例才行)。
    包装类型就是把基本类型变成一个类实例,一定要new才产生,可以调用方法,可以放入容器。

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

    栈存储运行时声明的变量——对象引用(或基础类型, 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 //最大堆大小

  • 相关阅读:
    关于xml的使用。
    Input标签文件上传,使用详解
    webpack 集成 Typescript && Less
    ionic3 多级联动城市选择插件 ion-multi-picker
    ionic2(3) 密码键盘组件 ionic2-pincode-input 使用
    ionic3 图片(轮播)预览 ionic-gallary-modal组件使用方法
    ios打包,通过Xcode生成ipa文件
    php常见的验证方法
    php 时间转化为刚刚、几秒前、几分前、几天前等等,友好时间提示
    ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
  • 原文地址:https://www.cnblogs.com/tv151579/p/3647238.html
Copyright © 2011-2022 走看看