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

    原文链接:https://www.cnblogs.com/tv151579/p/3647238.html

    转自: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 //最大堆大小

  • 相关阅读:
    安装lnmp 时如何修改数据库数据存储地址及默认访问地址
    ubuntu 设置root用户密码并实现root用户登录
    解决ubuntu 远程连接问题
    linux 搭建FTP服务器
    PHP 根据ip获取对应的实际地址
    如何发布自己的composer包
    使用composer安装composer包报Your requirements could not be resolved to an installable set of packages
    laravel 框架配置404等异常页面
    使用Xshell登录linux服务器报WARNING! The remote SSH server rejected X11 forwarding request
    IoTSharp 已支持国产松果时序数据库PinusDB
  • 原文地址:https://www.cnblogs.com/eryun/p/10065188.html
Copyright © 2011-2022 走看看