热门标签 | 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程序是多线程执行的,为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。

 


推荐阅读
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 传统上,Java 的 String 类一直使用 char 数组来存储字符数据。然而,在 Java 9 及更高版本中,String 类的内部实现改为使用 byte 数组。本文将探讨这一变化的原因及其带来的好处。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
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社区 版权所有