Java堆、栈、方法区、等理解

堆:

      堆中主要存放Java程序在运行过程中new出来的对象,凡是通过new关键字产生的对象都在堆中,堆中这些对象的生命周期统一由Java虚拟机(JVM)的垃圾回收机制GC进行回收和管理。类中的非静态成员变量存放在堆中,其中基本的数据类型是直接存放在堆中的,引用型数据类型则是存放它们的地址值,非静态成员变量在类的实例化时,在堆中开辟空间并且初始化。

 

栈:

     栈主要存放方法在运行时期用到的一些局部变量(基本数据类型的变量)或者是引用类型的变量,因为方法执行时,被分配的方法内存就在栈中,所以存储的局部变量就在栈中。当运行一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放。栈就是为及时调用的方法开辟一个内存空间,存储局部变量(基本数据类型),

 

常量池:

     常量池是方法区的一部分内存,常量池在编译期间就将一部分数据存放在该区域。其中包含基本数据类型int、long等以及String字符串和以final声明的常量值等,值得注意的是,在方法运行时期位于栈中的局部变量String常量的值可以通过String.intern()方法将该值置入到常量池中。

 

静态域:

      位于方法区的一块内存,存放以static声明的静态成员变量

方法区:

     方法区是被各个线程所共享的内存区域,它用来存放class二进制文件,包含了虚拟机加载的类的信息、常量、静态变量,常量池、静态域、及时编译器编译后的代码等数据。

 

成员变量和局部变量总结;

      成员变量是在类中声明的变量,也叫作全局变量,它是存放在中的。成员变量可以是基本类型的变量,也可以是引用类型的变量。

   (1)当成员变量声明的是基本类型的变量时,其变量名和变量值存储在内存中。

   (2)当成员变量成名的是引用类型的变量时,在堆内存中依然会存储该变量的一个内存地址,然后内存地址值指向所引用的对象。

 

 

       局部变量是在方法中声明的变量,当Java程序调用方法时,系统就会为方法开辟的一个方法栈空间,方法中声明的变量就会存放在方法栈中,当该方法结束后,方法中声明的局部变量就会随着栈的销毁而消失。这就是局部变量只能方法中使用的原因。在方法中声明的变量可以是基本数据类型的变量,也可以是引用类型的变量。

    (1)当方法中声明的变量是基本类型的变量时,其变量名和变量值都存放咋方法栈中。

   (2)当方法中声明的变量是引用类型的变量时,该引用类型的变量实际是上在方法时存储着它的内存地址值,(方法的栈中存储着该变量的内存地址值),该变量内初地址所指向的对象则在方法的堆中。

 

以下为程序运行时,内存图。

     

Java堆、栈、方法区、等理解

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-11
  • 2021-12-18
  • 2022-02-07
  • 2021-06-25
  • 2021-08-07
  • 2022-02-07
猜你喜欢
  • 2021-04-09
  • 2021-09-22
  • 2022-02-07
  • 2021-12-11
  • 2021-12-18
  • 2021-06-26
  • 2021-11-15
相关资源
相似解决方案