ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

JVM内存区域划分

2022-02-22 23:32:31  阅读:168  来源: 互联网

标签:Java 变量 对象 局部变量 数据类型 划分 内存 JVM 引用


JVM内存区域划分

根据《Java虚拟机规范》JVM会把它管理的内存划分为若干个不同的数据区域,方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器**。线程私有的意思是指,JVM每遇到一个新的线程就会为他们分配栈和程序计数器。

  • 局部变量中 基础数据类型的引用 都存储在栈中
  • 局部变量中 对象引用存在栈中对象实例存在堆中

栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。

成员变量: 成员变量存储在堆中。 默认值:有默认值,在构造器中可以不对成员变量进行初始化。 生命周期:从对象实例化开始,到对象被GC垃圾回收为止。

局部变量: 局部变量存储在栈中。默认值:没有默认值,使用前需要初始化。生命周期:从声明开始到方法结束弹栈为止。

1、共同点:堆和栈都是Java中用来在RAM中存放数据的地方。

2、区别:

(1)栈(Stack):Java中一个线程一个栈区,每一个栈中的元素都是私有的,不被其他栈所访问。栈有后进先出的特点,栈中的数据大小与生存期都是确定的,缺乏灵活性,但是,存取速度比堆要快,仅次于CPU中的寄存器,另外栈中的数据是共享的。在Java中,所有的基本数据类型和引用变量(对象引用)都在栈中存储,栈中数据的生存空间一般在当前的scopes内,也就是“{}”的部分,栈空间里装的都是局部变量。比如:函数的参数值,局部变量等,是自动清除的。

基本数据类型:Java中的基本数据类型包括8种,分别是byte、short、int、long、float、double、boolean、char;
通过以下例子说明: int m=2;int n=2;
当定义的是基本数据类型时,这些字面值的数据,大小和生命周期皆可知;编译器首先处理 int m=2; 先是在栈中创建一个变量为m的引用,然后查找有没有值为2的地址,没有则开辟一个新的存放字面值为2的地址,然后将m指向2的地址。接着处理 int n=2; 在创建完n的引用变量之后,由于存在2这个数值,则将n指向2的地址。这样会出现(m==n)为true的情况,也就是m和n指向同一个地址。

类对象的引用类型:与字面值的引用不同,当同时指向一个地址的类对象的引用,如果该对象的内部状态发生改变,则另一个对象引用变量也发生变化。与之相反,当定义完m之后,修改m的值,即m=3,那么n不会发生改变,依然等于2。

(2)堆(Heap):Java中只有一个堆,被所有线程共享。堆中的数据没有先后顺序(逻辑上连续就好),堆中的数据不需要事先告诉编译器它的生存期,可以动态的分配内存的大小(动态的申请内存空间),也就是这样导致了存取速度慢。不再使用的数据由Java中的垃圾回收机制自动回收。在Java中由new创建出来的对象都是在堆中的,当垃圾回收机制检测到某对象未被引用时,则自动销毁该对象。(非static修饰的全局变量是特殊的对象,在堆内存区域内)

包装类数据:Java中的包装数据类型包括Byte、Short、Integer、Long、Float、Double、Boolean、Character。这些数据类型都是存放在堆中的,Java中通过new( ) 操作显示的告诉编译器,当运行时根据需要动态创建,缺点就是速度慢。

String类型:是一种特殊的包装类,也是通过new( )操作动态的创建数据,比如:String s1=new String(“abcd”);

(3)方法区:又叫静态区,跟堆一样,被所有的线程共享;方法区包含所有的class和static变量;方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。方法区里装的都是基本类型常量和字符串常量、static修饰的全局变量、代码

标签:Java,变量,对象,局部变量,数据类型,划分,内存,JVM,引用
来源: https://blog.csdn.net/zzq1216678132/article/details/123079870

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有