Java:Java中的堆栈和堆内存-小妾漫画

  Java 数据类型在执行期间存储在两种不同形式的内存中:堆栈和堆。它们通常由运行 Java 虚拟机 (JVM) 的底层平台维护。本编程教程从 Java 软件开发的角度提供了对这两种内存类型的一些见解。

  Java平台是如何工作的?

  Java程序运行在Java虚拟机(JVM)。这个平台是管理器,它提供java应用程序在运行时需要的所有资源。这意味着开发人员编写的程序或者我们创建的应用程序没有能力直接访问系统资源(无论是硬件还是软件),除非它运行的平台提供了这种能力。在Java中,顺序是这样的:

  

  JVM层使Java平台变得独立。其他编程语言,如C/C++,不使用这样的层,因此,尽管它们是可移植的,但它们本身并不是平台独立的:

  

  这两种情况都有很多优点和缺点。由于开发Java语言和JVM平台的人是同一批人,对程序员便利性的偏见是显而易见的。这导致了巨大的进化;Java最初是一门语言,今天它已经成为一个自己的生态系统。同时,像C/C++这样的编程语言更倾向于通过能够直接访问系统资源来优化核心单元的使用,从而产生超级快速和高效的程序。但是两者在软件开发领域都有其用途。

  就一般语言而言,所有编程语言在编译和执行过程中都有许多相似之处。这些领域中最重要的一个是内存管理。不管使用什么语言,内存管理对程序的整体效率都有很大的影响,因为它有助于管理内存资源,从而提高应用程序的性能。使用的内存越多,程序就越慢。

  Java中的运行时内存是什么?

  应用程序中的一个常见现象是,每个应用程序都需要一些内存来以最佳方式工作。这个内存是由底层平台提供的。在Java的情况下,JVM提供了它(当然,这是操作系统授予的)。JVM内存的五个典型部分包括:方法区、堆、栈、PC寄存器和本机内存。

  现在让我们把重点放在栈和堆部分。内存不像一张白纸,程序员可以通过草草记下来存储数据。相反,内存需要在使用前进行结构化。堆栈和堆是使用内存时遵循的数据结构。在程序执行期间,存储的数据用于各种目的,这取决于程序的目的。

  JVM决定程序执行期间使用的运行时数据区。有些数据区是依赖于JVM的,这意味着它们是在JVM启动时创建的,并在JVM的整个生命周期中继续存在。但是,每个线程都会创建和销毁其他数据区域。JVM可以同时执行多个执行线程。这意味着每个线程都有自己的pc(程序计数器)寄存器,来维护当前正在执行的指令的位置,以及一个堆栈,用于保存静态内存分配。

  

  Java中的堆栈内存是什么?

  堆栈是内存中的一种结构,开发人员以一种允许检索数据的方式存储元素,仅仅从堆栈顶部开始–通常称为先入后出(FILO或LIFO)。因为每个线程都维护一个私有的JVM堆栈,所以它被用来存储与它们的静态内存分配相关的变量。我们在代码中声明和使用的特定于方法的原始变量实际上存储在堆栈区域中。此外,对实际存储在堆内存中的对象的引用也存储在堆栈区域中。因此,任何本地分配的内存都存储在堆栈中。

  可以使用JVM参数-Xss改变堆栈内存的默认大小。有时,如果分配了太多变量或者一个方法递归地调用自己,堆栈可能会溢出。所有Java程序员都知道的一个常见错误是java.lang.StackOverFlowError。当堆栈变满时,会弹出此错误。Java中的每个方法调用都会在堆栈中创建一个新的块。因此,设计不佳的递归方法调用很容易耗尽所有堆栈,导致溢出错误。

  Java中的堆内存是什么?

  堆是一个内存区域,它在 JVM 启动后立即创建并继续存在,直到JVM被销毁。与堆栈不同,堆栈是单个线程的属性(因为每个线程都有自己的堆栈),堆实际上是由JVM本身管理的全局存储。这个内存在运行时用于为对象分配内存。因此,对象实例化可以是用户定义的类、JDK或其他库类。简而言之,使用新关键字创建的任何对象都存储在堆内存中。JVM运行的所有线程都可以访问堆内存中的对象。访问管理很复杂,并且使用非常复杂的算法。这就是JVM垃圾收集器发挥作用的地方。

  可以使用 -Xms 和 -Xmx JVM 参数更改堆的默认大小。随着对象数量的增加和减少,堆的大小也会增加和减少。如果达到其最大限制并尝试进一步分配,它将引发java.lang.OutOfMemoryError。

  Java堆字符串池

  非常有趣的是,虽然它是一个类,但使用java.lang.String,从该类实例化的任何对象的处理方式都不同。JVM创建者发现这是Java编程中使用最多的类。因此,应特别注意保持其效率。此外,与原始类型相比,字符串操作总是很慢。因此,必须存在这样的魔力,以便字符串对象的使用在代码中的效率和便利性方面类似于或接近于原始类型。因此,为了保持JVM提供的效率,使用了堆中一个称为字符串池的特殊内存区域。创建的任何字符串对象都由 JVM 存储在字符串池中。与堆中创建的其他对象相比,这提高了多方面的性能。

  关于Java堆栈和堆内存的最终想法

  堆栈和堆是Java程序在代码执行期间使用的两个区域。除了这两个,还有其他的内存区域,比如方法区、寄存器、本地区等等。每一种在Java应用程序中都有其特定的用途。但是,从程序员的角度来看,堆栈和堆是JVM的基本方面,人们必须理解。然而,对所有运行时内存规范的透彻理解总是有利的,并且将成为未来Java编程教程的主题。

10月20日,intel 13th Core系列便将如期登场了。桌面版12代酷睿凭借大小核和10nm工艺,上市表现就很抢眼,性能提升不错,i9-12900较于上一代i9-11900内容创作性能提升达到了55%,游戏性能更是有着21%。而让大家头疼的唯一问题那就是散热了!有不少玩家用360水冷烤12700K,默频烤机就轻松85度,即便锁了电压到1.2V,功率也依旧能达到195W。还有使用FC140的,默频全自动电压显示最高1.33V。功耗195W左右。温度秒上100度。而大家会看到我已经拿到了13
2022-10-17
[pixiv]个人精挑windows桌面壁纸 分辨率均>2560x1440 [100P-407MB]
2023-05-21
英菲尼迪QX50说明书为PDF电子版本,英菲尼迪QX50车主手册帮助车主快速掌握车辆的各种实用功能,免费下载方便携带,英菲尼迪QX50用户手册是车主必备的电子使用手册。点击进入:https://www.carobook.com/infiniti-sms/infiniti-qx50-owners-manual.html英菲尼迪QX50说明书用户手册|Infiniti QX50 Owner's Manual英菲尼迪QX50基于英菲尼迪全新豪华SUV四驱平台打造,并搭载全球首款量产可变压缩比发动机VC
2022-10-13
声优野津山幸宏宣布和演员小玉百夏宣布了结婚的消息。二人是通过共同的熟人认识的,之后相互喜欢上了对方,最终决定结婚。在今后,二人也会继续在演艺圈工作。
2022-10-28
[ARTGRAVIA] VOL.436 Oh Duck Hwa [79P-102MB]
2023-05-21
铭铭Kizami - VOL.21 徐々に成熟した大人 [125P448M
2021-06-06
[Lilynah] LW062 Shaany (샤니) Vol.16[44P/61M]
2023-05-27
YuanYuan - pixiv[201P-589M]
2023-06-12
1. 也许我能给到你的并不是你要的爱情,也许你忘了我曾出现在你的记忆,不论怎样你始终都是能让我动容的回忆,一定要好好对自己。 ——网易云音乐热评《好好对自己》2. 考59分比考零分更难过,最痛苦的不是不曾拥有,而是差一点就可以。——网易云音乐热评《淘汰》3. 不要以为你放不下的人也同样放不下你,鱼没有水会死,水没有鱼却会更清澈。——网易云音乐热评《像鱼》4. 扔过那么多的东西,离开过那么多的人,身边的人来来往往,忘记过那么多熟悉的脸,熬过无数个深夜和黎明,义无反顾撞过那么多南墙,皆是黄粱一梦的空
2022-10-12
【Amanda Welp】 Bowsette [28P 47MB]
2023-06-14