Java 内存管理

深入了解 Java 内存管理将增强您对堆如何工作、引用类型和垃圾收集的了解。

您可能会想,如果您使用 Java 进行编程,您需要了解内存的工作原理吗?Java 有自动内存管理,一个漂亮而安静的垃圾收集器,它在后台工作以清理未使用的对象并释放一些内存。

因此,作为一名 Java 程序员,您无需为诸如销毁对象之类的问题而烦恼,因为它们不再被使用。然而,即使这个过程在 Java 中是自动的,它也不能保证任何事情。由于不知道垃圾收集器和 Java 内存是如何设计的,您可能会拥有不符合垃圾收集条件的对象,即使您不再使用它们。

因此,了解内存在 Java 中的实际工作方式很重要,因为它使您能够编写高性能和优化的应用程序,这些应用程序永远不会因OutOfMemoryError. 另一方面,当你发现自己处于糟糕的境地时,你将能够快速找到内存泄漏。

首先,让我们看一下内存在 Java 中通常是如何组织的:

内存结构

通常,内存分为两大部分:堆栈堆。 请记住,这张图片中内存类型的大小与现实中的内存大小不成比例。与堆栈相比,堆是一个巨大的内存量。

堆栈

堆栈内存负责保存对堆对象的引用和存储值类型(在 Java 中也称为原始类型),它保存值本身而不是对堆中对象的引用。

此外,栈上的变量具有一定的可见性,也称为作用域。仅使用来自活动范围的对象。例如,假设我们没有任何全局范围变量(字段),只有局部变量,如果编译器执行一个方法体,它只能从堆栈中访问方法体中的对象。它无法访问其他局部变量,因为它们超出了范围。一旦方法完成并返回,堆栈的顶部就会弹出,并且活动范围会发生变化。

也许你注意到上图中显示了多个堆栈内存。这是因为 Java 中的堆栈内存是按线程分配的。因此,每次创建和启动线程时,它都有自己的堆栈内存——并且不能访问另一个线程的堆栈内存。

这部分内存将实际对象存储在内存中。这些由堆栈中的变量引用。例如,让我们分析以下代码行中发生的情况:

StringBuilder builder = new StringBuilder();

该 new关键字负责确保堆上有足够的空闲空间,在内存中创建一个 StringBuilder 类型的对象,并通过堆栈上的“builder”引用来引用它。

每个运行的 JVM 进程只存在一个堆内存。因此,无论有多少线程正在运行,这都是内存的共享部分。实际上,堆结构与上图中显示的有点不同。堆本身被分成几个部分,这有利于垃圾收集的过程。

最大堆栈和堆大小未预定义——这取决于正在运行的机器。但是,在本文后面,我们将研究一些 JVM 配置,这些配置将允许我们为正在运行的应用程序显式指定它们的大小。</

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值