当前位置: 主页 > JAVA语言

java的堆 栈 方法区-:Java中的堆栈方法区JAVA的JVM的内存

发布时间:2023-06-14 11:05   浏览次数:次   作者:佚名

Java中的堆 栈 方法区

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

在这里插入图片描述

首先要明确堆是堆(heap),栈是栈(stack),堆栈是栈。

那么什么是 堆 栈,看看

Stack(栈)

原文

Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.

java堆内存和栈内存_栈堆方法区_java的堆 栈 方法区

翻译

每个Java虚拟线程都有自己的私有Java虚拟机栈,与该线程同时创建.与C语言中的栈相似,Java虚拟机栈保存局部变量,部分结果,并在函数调用和返回时起作用.Java虚拟机栈不被直接操作(除pop,push外),因此可以为堆分配帧…Java虚拟机栈内存不是连续的

在这里插入图片描述

函数调用的局部状态之所以用栈来记录是因为这些数据的存活时间满足后入先出”(LIFO)顺序java的堆 栈 方法区,而栈的基本操作正好就是支持这种顺序的访问。

举例说,假如有下面程序:

int main() {
  a();
  return 0;
}
void a() {
  b();
}
void b() {
  c();
}
void c() {
}

那么整个程序的函数活动时间可以表示为:

java堆内存和栈内存_java的堆 栈 方法区_栈堆方法区

main()  a()  b()  c()
   -                         main()
   |
   +>     -                    a()
   .      |
   .      +>   -                 b()
   .      .    |
   .      .    +>   -              c()
   .      .    .    |
   .      .    +   <-              return from c()
   .      .    |
   .      +   <-                 return from b()
   .      |
   +     <-                    return from a()
   |
   -                         return from main()

可以看到,函数的调用有完美的嵌套关系——调用者的生命期总是长于被调用者的生命期,并且后者在前者的之内。这样,被调用者的局部信息所占空间的分配总是后于调用者的(后入),而其释放则总是先于调用者的(先出),所以正好可以满足栈的LIFO顺序,选用栈这种数据结构来实现调用栈是一种很自然的选择。

特点

Heap(堆)

原文

The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.

The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor’s system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.

栈堆方法区_java的堆 栈 方法区_java堆内存和栈内存

翻译

Java虚拟机具有一个在所有Java虚拟机线程之间共享的堆。 堆是运行时数据区,从中分配所有类实例和数组的内存。

堆是在虚拟机启动时创建的。 自动存储管理系统(称为垃圾收集器)可以回收对象的堆存储; 对象永远不会显式释放。 Java虚拟机不假定特定类型的自动存储管理系统,可以根据实现者的系统要求选择存储管理技术。 堆的大小可以是固定的,也可以根据计算的要求进行扩展,如果不需要更大的堆,则可以将其收缩。 堆的内存不必是连续的。

在这里插入图片描述

JVM里的堆特指用于存放Java对象的内存区域。所以根据这个定义,Java对象全部都在堆上。要注意,这个“堆”并不是数据结构意义上的堆(Heap (data structure),一种有序的树),而是动态内存分配意义上的堆——用于管理动态生命周期的内存区域。JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做垃圾回收(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。

特点

与堆区别

java堆内存和栈内存_栈堆方法区_java的堆 栈 方法区

方法区

方法区(Method Area),与Java堆一样是各个线程共享的内存区域。用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

虽然Java虚拟机规范将方法区描述为堆的一个逻辑部分,但是它却有个别名叫做Non-Heap(非堆),目的就是和Java堆区分开来。Java虚拟机规范对方法区的限制十分宽松,除了和Java堆一样不需要连续的内存空间分配和可选择固定大小或可拓展内存以外,方法区也可以被垃圾回收器管理或不受其管理。

在Java7以前,HotSpot虚拟机中,方法区也被称为“永久代”,因为在物理上java的堆 栈 方法区,方法区使用的是由JVM开辟的堆内存,由于和Java堆共享内存且内存空间由垃圾收集器统一分配和管理,自然的垃圾收集也拓展到了方法区上。此时,Java堆中分区为青年代Young Generation和老年代Old Generation,而方法区自然地被称为永久代Permanent Generation 。

在Java8中,HotSpot虚拟机改变了原有方法区的物理实现,将原本由JVM管理内存的方法区的内存移到了虚拟机以外的计算机本地内存,并将其称为元空间(Metaspace)。这样一来,现在的方法区实际存储在于元空间,再也不用和Java堆共享内存了,“永久代”也就永久地被撤销了。

特点

方法区:

栈堆方法区_java的堆 栈 方法区_java堆内存和栈内存

快速记忆

java内存是分为堆,栈和方法区。

堆中分配的是对象,也就是new出来的东西。

栈中分配的是基本类型和自定义对象的引用。

方法区存放的是类信息和static变量。

通过下述例子,进一步加深概念.

例 对于一个方法

public void Method1()
{
    int i = 4;
    int y = 2;
    class1 cls1 = new class1();
}

在这里插入图片描述