热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JVM中堆和栈的区别

栈(stack)和堆(heap)都是JAVA在RAM中存放数据的地方。*与C++不同,JAVA自动管理栈和堆,程序员不能直接的设置栈和堆。栈内存:存储的都是局部变量,而且变量所属的作用

栈(stack)和堆(heap)都是JAVA在RAM中存放数据的地方。

*与C++不同,JAVA自动管理栈和堆,程序员不能直接的设置栈和堆。

栈内存:

  存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放。

堆内存:

  存储的是数组和对象(其实数组也是对象),凡是new建立在堆中。

  特点:1.每一个实体都有首地址值;

     2.堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同;

栈和堆在内存中的存储方式可参考下图:

举例:int[] arr = new int[3];

步骤:

  1,创建变量arr,且这个局部变量在主函数中,故主函数的代码段先进栈;

  2,右边用new建立的对象是实体,故放在堆中;

  3,给该对象分配一个内存地址,用来存放该对象,比如:0x0045;(堆会对其中的对象进行默认初始化)

  4,将对象的地址0x0045赋给栈中的变量arr,而arr就指向堆中的这个地址(也可以作称作引用这个地址),类似于c++中的指针。

 

 

栈的优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器。

栈的缺点:1.存在栈中的数据大小和生存期必须是确定的,缺乏灵活性。

     2.栈数据在多个线程或者多个栈之间是不可以共享的。(但是,在栈内部多个值相等的变量是可以指向一个地址的)

堆的优势:可以动态的分配内存大小,生存期也不必事先告诉编译器,JAVA的垃圾收集器会自动收走不用的数据。

堆的缺点:由于要在运行时动态分配内存,存取速度较慢。

 

JAVA中的数据类型有两种:

  一.基本类型(byte,short,int,long,float,double,boolean,char)

这种类型定义的变量被称作自动变量,自动变量存的是字面值,不是类的实例(即不是类的引用)。

比如:int a=3,long b=255L   这些字面值的数据,由于大小可知,生存期可知,出于追求速度的原因,就存在于栈中。

  二.包装类数据(如Integer,String,Double等将相应的基本数据类型包装起来的类,这些类数据全部存在于堆中)

JAVA用new语句来显式的告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。

注意:包装类的值不可修改!

 

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

 

由上图1可知,JVM的基本结构包括:类装载器,内存区域,执行引擎,本地库接口。

下面主要介绍一下内存区:

1.虚拟机栈

  每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈,故每个线程包含一个栈区。

每个栈中的数据都是私有的,其它栈不能访问。栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区。

2.堆内存

  存储的全部是对象,每个对象包含一个与之对应的class信息-----class的目的是得到操作指令。

jvm只有一个堆区被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。

3.方法区

  在方法区中,存储了每个类的信息(包括类的名称、方法、字段)、静态变量、常量以及编译器编译后的代码等。

4.本地方法栈

  和虚拟机栈的作用差不多,只不过是为JVM使用到的native方法服务的。

*.在HotSopt虚拟机中直接就把本地方法栈和虚拟机栈合二为一了。

5.程序计数器

  用于保存当前线程执行的内存地址。

由于JVM程序是多线程执行的,为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。

 


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
随风2502891175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有