`
pingwei000
  • 浏览: 60956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java 栈(stack) 与 堆(heap)

阅读更多
Java 栈是由许多帧(frame)组成的,一个帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的帧至该线程序的Java栈中,当该方法返回时,这个帧被从该线程所属的栈中弹出。

Java中每个线程都有自己独立的栈。

public class Hello{
  
    private Hello(){
        new Hello();
    }
  
  
    public static void main(String args[]){
        new Hello();
    }
}


如上代码将产生异常:
Exception in thread "main" java.lang.StackOverflowError
    at com.livedoor.classcode.Hello.<init>(Hello.java:9)
    at com.livedoor.classcode.Hello.<init>(Hello.java:9)
    at com.livedoor.classcode.Hello.<init>(Hello.java:9)
    at com.livedoor.classcode.Hello.<init>(Hello.java:9)

异常明确提示 栈 溢出了。



Java 堆(heap) 是用于保存 java对象的。实际上就是Java 的 object pool.
所有的java对象都放在了这个pool中。

如下代码:

public class Hello{
  
    private Hello(){
        List aa=new ArrayList();
        for(int i=0;i<10000000;i++){
            aa.add(new String("dd"));
        }
        System.out.println("OK");
    }
  
  
    public static void main(String args[]){
        new Hello();
    }
}

异常:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

则表是产生的对象过多,超出了heap的限制。

Java程序在运行时创建的所有类实例或数组都放在同一个堆中。而一个Java虚拟机实例中只存在一个堆空间,因此所有线程都将共享这个堆。Java虚拟机有一条在堆中分配新对象的指令(没有释放内存的指令)。正如你无法用Java代码去明确释放一个对象一样,字节码指令也没有对应的功能。虚拟机自己负责决定如何以及何时释放不再被运行的程序引用的对象所占据的堆内存。

-------------------------------------------------

以上两种异常经常被混消。如果出现stack溢出异常很可能是因为某个方法产生了死递归调用。

而heap溢出的话可能要麻烦一些,查找起来原因也费事一些。
分享到:
评论

相关推荐

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    关于Java栈与堆的思考-

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    关于Java栈与堆的思考

    关于Java栈与堆的深入解析 Java作为一种广泛使用的编程语言,其内存管理机制是学习者必须掌握的核心概念之一。在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解...

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    Java中堆内存与栈内存分配浅析

    程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...

    详解java堆和栈

    在Java编程中,理解堆(Heap)和栈(Stack)的概念及其区别对于程序员来说至关重要。本文将深入剖析这两个概念,并探讨它们之间的差异以及如何影响程序的运行。 #### 二、Java中的栈(Stack) Java中的栈主要用于...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...

    java解决nested exception is java.lang.OutOfMemoryError Java heap space

    Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area),其中堆是用于存储对象实例的主要区域,当堆空间不足时,就会抛出`OutOfMemoryError: Java heap space`。 1. **调整JVM堆大小**:可以...

    深入堆与栈 堆与栈的区别

    ##### 示例2:字符串常量池与堆的区别 ```java String s0 = "kvill"; String s1 = "kvill"; String s2 = "kv" + "ill"; System.out.println(s0 == s1); System.out.println(s0 == s2); ``` 这里涉及到字符串常量池...

    Java中堆内存和栈内存详解

    本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员理解和优化Java程序至关重要。 #### 二、栈内存 栈内存主要用于存储方法的...

    java中的栈(深层了解java虚拟机对对象的内存分布)

    在Java编程语言中,理解栈(stack)和堆(heap)的概念及其工作原理对于深入掌握Java虚拟机(JVM)如何管理内存至关重要。栈和堆都是在RAM中用于存储数据的关键区域,但在功能、使用场景和管理机制上存在显著差异。 #### ...

    区别Java中的堆与栈

    与堆不同,Java的栈用于存储基本类型变量和对象的引用。栈是一种线性的数据结构,遵循先进后出(LIFO)的原则。当函数调用发生时,相应的局部变量和参数会被压入栈中;当函数返回时,这些数据将从栈中弹出,释放所占...

    变量在Java栈、堆内存中的运用管理分析.pdf

    Java内存主要分为两个核心区域:栈(Stack)和堆(Heap)。本文将详细解析这两个区域中变量的分配与管理。 1. 栈内存 栈内存主要用于存储基本数据类型变量和对象引用。当在方法内部声明一个变量时,Java会在栈中为...

    基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍

    在Java中,内存主要分为两个区域:栈(Stack)和堆(Heap),以及垃圾回收机制(Garbage Collection)。 栈是程序执行过程中的临时数据存储区域,主要用于存储基本类型(如int、char)和对象的引用。每当一个方法被...

    Java中堆与栈的内存分配.pdf

    在Java中,内存被分为两部分:堆(Heap)和栈(Stack)。堆是用来存放对象的,它是由Java虚拟机(JVM)管理的。栈是用来存放基本类型的变量和对象的引用变量的,它是由Java编译器管理的。 2. 堆的内存分配 在Java...

    java 虚拟机 内存和栈 分析工具 ha456.rar

    Java内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五大部分: 1. **堆**:Java对象主要存储在堆中,它是所有线程共享的一块区域。...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    Java内存分为堆(Heap)、方法区(Method Area)、栈(Stack)、本地方法栈(Native Method Stack)和程序计数器(PC Register)五大部分。HeapAnalyzer主要关注的是堆内存,特别是新生代(Young Generation)、老...

Global site tag (gtag.js) - Google Analytics