首页 > 系统相关 >java内存分配(堆,栈,方法区,常量池)图解

java内存分配(堆,栈,方法区,常量池)图解

时间:2023-09-21 23:34:58浏览次数:58  
标签:java 常量 demo 数据类型 内存 图解 方法 String

大家都知道,java程序是运行在jvm(java虚拟机)上的,因此Java的内存分配是在JVM中进行的。那么在程序内存分配上面,大致分为:本地方法栈、程序计数器、虚拟机栈、java堆、方法区。这五类,本次主要讲解的是虚拟机栈、java堆和方法区中的内容。

栈:存放基本数据类型的数据、引用数据类型的变量名及对象的引用,但是引用的数据与对象并不放在栈中,而是放在堆中。
堆:存放引用数据类型的数据与new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。
方法区:存放静态的不变的资源
常量池:在JDK1.6及之前的版本,字符串常量池存放在方法区中间,在JDK1.7版本以后,字符串常量池就被移到堆中了。
{

1.在java编译后生成.class文件,会放在常量池中,每一个class文件都有一个对应的class常量池。
2.会存放基本数据类型的值
3.会存放被声明为final的常量
}

 

 

下面用代码来实际举例演示:

 1 public class Demo {
 2     String username;
 3     public void method() {
 4         int i=1;
 5         System.out.println("执行类方法");
 6     }
 7     public static void main(String[] args) {
 8         int i=1;
 9         String str="hello java";
10         Demo demo=new Demo();
11         demo.username="123";
12         demo.method();
13         
14     }
15  
16 }

 


大家请看这段代码,下面我会为大家一一讲解内存分配过程。

1、首先这是一个Demo类,那么在编译后会生成Demo.class文件,放在常量池中;

2、main方法是程序的主入口,那么在栈中会生成main方法的方法帧。

3、执行第一行代码 int i=1; 由于int是基本数据类型,会在栈中给 i=1分配内存空间。

4、下面执行String……,由于String是引用数据类型,那么str变量名会放在栈中,但是里面的值"hello java"会放在方法区的常量池中。str指向hello java。

5、 new了一个demo对象,那么会在栈中存入demo对象,指向堆中,堆中存入具体的对象属性

6、声明了demo对象的username属性,那么会在堆中存入“123”。

7、调用了demo对象的method方法,那么会在栈里面又生成一个方法帧,由于栈的先进后出的特点,会先执行新的方法帧里面的内容,这时会执行method方法里的程序,打印输出执行类方法

8、method方法执行完毕,方法帧里没有线程后,方法帧会出栈,

注意:方法帧出栈后,相对应的堆和方法区里的内容不会清空,会等到进程结束,垃圾回收机制会进行处理

9、main方法执行完毕,出栈,线程结束,栈中没有方法帧,进程结束。

 

下面进行图解:

 

标签:java,常量,demo,数据类型,内存,图解,方法,String
From: https://www.cnblogs.com/szmtjs10/p/17721246.html

相关文章

  • JAVA基础 —— 面向对象内存图
    JAVA基础——面向对象内存图......
  • java语言基础--对象内存图解
    在JVM内存里面主要分布有以下三个区域:栈:存放基础数据和自定义对象的引用堆:主要存储创建的对象,即new出来的对象。方法区:加载存放class文件(字节码文件)创建一个对象: 通过上图来看,程序是这样执行的:将StudentTest01.class文件加载到方法区将Student.class文件加载到方法区......
  • Java 序列化与反序列化的疑问
    关于序列化和反序列化的疑问为什么需要序列化和反序列化?因为计算机底层存储和传输都是二进制,所以需要将对象转化成字节数组。那么问题来了,只需要转成字节数组就行了,那为啥还要弄这么多东西?搞这么复杂?因为直接转生成的字节数组是不规则的,所以我们不能通过这样的字节数组把原......
  • 用javaweb技术设计一个网页需要什么软件
    对于使用JavaWeb技术设计一个网页,需要准备以下软件:JavaDevelopmentKit(JDK):这是Java开发的基本工具包,包括Java编译器、运行时环境和其他工具。IDE(集成开发环境):常见的JavaWeb开发IDE包括Eclipse、IntelliJIDEA和NetBeans。这些IDE提供了代码编辑、调试和部署等功能,使开发......
  • Java基础
    Java基础一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。基本语法大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字......
  • 一文读懂Java输入输出:编程新手必看
    输出在前面的代码中,我们总是使用System.out.println()来向屏幕输出一些内容。println是printline的缩写,表示输出并换行。因此,如果输出后不想换行,可以用print():注意观察上述代码的执行效果。格式化输出Java还提供了格式化输出的功能。为什么要格式化输出?因为计算机表示的数据不一定......
  • java--内存与数据结构
    JVM内存划分 栈一种数据结构特点:先进后出(FILO)入栈:把元素放到栈里栈顶:栈中的第一个元素栈底:栈中的最后一个元素出栈:把元素从栈里移除   基本数据类型–值传递 引用类型–地址传递 堆数组在堆中存储 若堆中的内存空间没有被引用的时候,就会变成垃圾,等着......
  • Java基础语法(1)
    Java基础语法JAVA--黑马程序员笔记一、Java入门1、JAVA是一种很火的计算机语言。2、JAVA代码编写分三步:编写程序源码,即编写一个java文件编译:翻译文件,javac是JDK提供的编译工具,对java文件编译后会产生一个class文件,class文件即交给计算机执行的文件。Eg:javachell......
  • JAVA基础学习——面型对象进阶
    1static2继承   1static1.1内存图静态对象是随着类加载,非静态对象随着对象来的: 引用类型初始化时null值。 1.2static静态变量、静态方法 1.3总结  ①静态方法中没有this,非静态方法中有静态的一般用于共享,不面向某一个对象,所以没有this;而非......
  • 虚拟内存
    看完B站清华大学的操作系统虚拟内存这一部分,进行总结一下。虚拟内存的起因(1)目录起因覆盖技术(早期)/交换技术(早期)/虚存技术虚拟内存技术:目标/程序局部性原理/基本概念/基本特征/虚拟页式内存管理(2)起因经常出现内存不够了。程序规模的增长大于存储器容量的增长。理想的存......