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编程教程的主题。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部