博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写Java代码分别使堆溢出,栈溢出
阅读量:5094 次
发布时间:2019-06-13

本文共 1189 字,大约阅读时间需要 3 分钟。

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

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

转载于:https://www.cnblogs.com/MJyc/p/10408222.html

你可能感兴趣的文章
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
ActiveMQ与spring整合
查看>>
第一阶段冲刺06
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
排球积分程序(三)——模型类的设计
查看>>
HDU 4635 Strongly connected
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
关于TFS2010使用常见问题
查看>>
URL编码与解码
查看>>
Eclipse 安装SVN插件
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>