`
白浪滔天
  • 浏览: 86374 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

写Java代码分别使堆溢出,栈溢出

    博客分类:
  • java
阅读更多

 

我们知道,在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 //最大堆大小

 

分享到:
评论
1 楼 daoqidelv 2014-05-26  
递归调用可以导致栈溢出
不断创建对象可以导致堆溢出

相关推荐

    Java常见内存溢出异常分析

     栈溢出抛出java.lang.StackOverflowError错误,出现此种情况是因为方法运行的时候栈的深度超过了虚拟机容许的大深度所致。  出现这种情况,一般情况下是程序错误所致的,比如写了一个死递归,有可能造成此种...

    Java开发技术大全(500个源代码).

    overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java 用switch语句评定成绩等级 ...

    java堆栈的区别 -- 详解

    栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所...

    java内存分配详解

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的 栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当...

    java核心面试技术点

    答:Java把内存划分成两种:一种是栈内存,一种是堆内存。 栈内存:存放对象:函数中基本类型的变量和对象的引用变量、静态类方法 ;特点:栈有一个很重要的特殊性,就是存在栈中的数据可以共享。 堆内存:存放...

    java核心面试

    答:Java把内存划分成两种:一种是栈内存,一种是堆内存。 栈内存:存放对象:函数中基本类型的变量和对象的引用变量、静态类方法 ;特点:栈有一个很重要的特殊性,就是存在栈中的数据可以共享。 堆内存:存放...

    华南农业大学18级编译原理综合性实验Java版.zip

    照着编译原理课本附录c.5敲,然后改语言为Java,然后解决了下课本代码回填出错的问题和栈溢出的问题。 实验要求:设计并实现一个一遍扫描的编译前端,将简化高级语言的部分语法成分(含赋值语句、分支语句、循环语句...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-122-Java基本语法-方法递归调用-栈溢出错误.avi 北京动力节点-Java编程零基础教程-123-Java基本语法-方法递归调用-不使用递归解决阶乘问题.avi 北京动力节点-Java编程零基础教程...

    【JVM和性能优化】1.Java内存区域

    文章目录了解的必要性JVM历史JVM数据区域私有区共有区内存区域版本变化1.61.71.8元空间栈跟堆Java中的对象都是在堆中分配吗逃逸分析标量替换栈上分配同步消除JVM对象对象创建过程对象内存布局对象访问方式通过句柄...

    Tomcat内存溢出的三种情况及解决办法分析

    有一点需要注意:java -Xmx***M version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize的 和 比如系统支持最大的jvm堆大小事1.5G,那 -Xmx1024m -XX:PermSize=768M 是无法运行的。 第三种:无法创建新的线程。 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 29 2.2.7 直接内存 / 29 2.3 对象访问 / 30 2.4 实战:OutOfMemoryError异常 / 32 2.4.1 Java堆溢出 / 32 2.4.2 虚拟机栈和本地方法栈溢出 / 35 2.4.3 运行时常量池溢出 / 38 2.4.4 方法区溢出 / 39 2.4.5...

    Java虚拟机

    2.4.2 虚拟机栈和本地方法栈溢出 2.4.3 方法区和运行时常量池溢出 2.4.4 本机直接内存溢出 2.5 本章小结 第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析...

    基于源代码的软件同源性分析与漏洞检测系统

    任务可以自己选择 Windows或者 Linux 平台实现,检测的源代码可以为 c/c++/Java.跨语言同源性为 c 语言与其它语言的对比检测。 我选择的系统环境为: Win10 VS2019 QT 1.4 实验过程记录 提供系统界面 所有功能要有...

    JAVA面试题最全集

    堆和栈的区别 20.ejb的分类及区别 21.你对现在软件业以及国内软件业的看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27....

    java 面试题 总结

    堆是栈的一个组成元素 19、forward 和redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从...

    java面试题

    这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类...

    JAVA虚拟机原理

    本文来自于csdn,文章主要从一下几个方面来介绍程序计数器,虚拟机栈,本地方法栈,堆区,方法区及直接内存等等相关方面介绍。JavaGC(GarbageCollection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,...

    word源码java-android-act-montior:这是一个userApp活动(不是视图)监控(一种监督)

    我是个新手,小白级那种,各位看看我写的c++代码就知道了(C#和JAVA中毒已深,反射JAVA层方法超级多,虽然比较稳定的那种),而且我自己都看出了好几个栈溢出覆盖返回值,临界资源不加锁导致可以race的绕过漏洞...

    超级有影响力霸气的Java面试题大全文档

    堆是栈的一个组成元素 22、forward 和redirect的区别  forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从...

    逆向工程权威指南.

    64、MIPS、Java/JVM等重要话题,详细解析了Oracle RDBMS、Itanium、软件狗、LD_PRELOAD、栈溢出、ELF、Win32 PE文件格式、x86-64(第、critical sections、syscalls、线程本地存储TLS、地址无关代码(PIC)、以配置...

Global site tag (gtag.js) - Google Analytics