高级编程:Java内存管理原理详细指南

2021年3月16日15:33:42 发表评论 795 次浏览

本文概述

本文将重点介绍Java内存管理, 堆的工作方式, 引用类型, 垃圾回收以及相关概念。

为什么要学习Java内存管理?

我们都知道Java本身管理内存, 不需要程序员的明确干预。垃圾收集器本身可确保清理未使用的空间, 并在不需要时释放内存。那么程序员的作用是什么, 为什么程序员需要学习Java内存管理?作为程序员, 你无需担心破坏对象, 将所有功劳归功于垃圾收集器等问题。但是, 自动垃圾收集并不能保证一切。如果我们不知道内存管理的工作原理, 通常我们会陷入非JVM(Java虚拟机)无法管理的事情之中。有些对象不符合自动垃圾收集的条件。

因此, 了解内存管理至关重要, 因为这将有利于程序员编写不会崩溃的基于高性能的程序, 如果这样做, 程序员将知道如何调试或克服崩溃。

介绍

在每种编程语言中, 内存都是至关重要的资源, 并且本质上也是稀缺的。因此, 至关重要的是, 必须对内存进行彻底的管理, 不要泄漏。内存的分配和释放是一项关键任务, 需要大量的照顾和考虑。但是, 在Java中, 与其他编程语言不同, JVM和特定的垃圾回收器具有管理内存分配的作用, 因此程序员无需这样做。而在其他编程语言(例如C)中, 程序员可以直接访问在其代码中分配内存的内存, 从而为泄漏创造了很大的空间。

Java内存管理的主要概念:

  • JVM内存结构
  • 垃圾收集器的工作

Java内存结构

JVM定义了在程序执行期间使用的各种运行时数据区域。一些区域是由JVM创建的, 而某些区域是由程序中使用的线程创建的。但是, 仅当JVM退出时, 才会破坏JVM创建的内存区域。线程的数据区域在实例化期间创建, 并在线程退出时销毁。

JVM内存区域部分

JVM内存区域部分

让我们详细研究一下内存区域的这些部分:

堆:

  • 它是共享的运行时数据区, 并将实际对象存储在内存中。在虚拟机启动期间实例化它。
  • 该内存分配给所有类实例和数组。堆可以是固定大小, 也可以是动态大小, 具体取决于系统的配置。
  • JVM提供了用户控件来根据需要初始化或更改堆的大小。使用new关键字时, 将在堆中为对象分配一个空间, 但是该对象的引用存在于堆栈中。
  • 一个正在运行的JVM进程只有一个堆。

扫描仪sc =新的扫描仪(System.in);

上面的语句创建Scanner类的对象, 该对象分配给堆, 而引用" sc"被推入堆栈。

注意:必须在堆区域中进行垃圾收集。

方法范围:

  • 它是堆区域的逻辑部分, 是在虚拟机启动时创建的。
  • 该内存分配给类结构, 方法数据和构造函数字段数据, 还分配给类中使用的接口或特殊方法。堆可以是固定大小, 也可以是动态大小, 具体取决于系统的配置。
  • 可以是固定大小, 也可以根据计算要求扩展。不需要是连续的。

注意:尽管从逻辑上讲方法区是堆的一部分, 但是即使在堆区中必须进行垃圾收集, 它也可能是垃圾收集, 也可能不是。

JVM堆栈:

  • 堆栈是在创建线程的同时创建的, 用于存储数据和部分结果, 这在返回方法值和执行动态链接时将需要这些数据和部分结果。
  • 堆栈可以是固定大小, 也可以是动态大小。创建堆栈时, 可以独立选择堆栈的大小。
  • 堆栈的内存不必是连续的。

本机方法堆栈:

也称为C堆栈, 本机方法堆栈不是用Java语言编写的。创建每个线程时, 将为每个线程分配该内存。它可以是固定的或动态的。

程序计数器(PC)寄存器:

每个执行特定方法任务的JVM线程都有一个与之关联的程序计数器寄存器。非本机方法具有PC, 该PC存储可用JVM指令的地址, 而在本机方法中, 程序计数器的值未定义。 PC寄存器能够在某些特定平台上存储返回地址或本机指针。

垃圾收集器的工作

  • JVM触发此过程, 并且按照JVM垃圾收集过程完成或保留。它通过自动执行内存的分配或释放来减轻程序员的负担。
  • 垃圾收集过程导致其余的过程或线程被暂停, 因此本质上是昂贵的。这个问题对于客户端来说是不可接受的, 但是可以通过应用几种基于垃圾收集器的算法来消除。这种应用算法的过程通常称为垃圾收集器调整对于提高程序性能非常重要。
  • 另一个解决方案是分代垃圾收集器, 它向分配了内存的对象添加年龄字段。随着创建的对象越来越多, 垃圾列表增加, 从而增加了垃圾收集时间。根据对象存活的时钟周期数, 将对象分组并相应地分配"年龄"。这样, 垃圾收集工作就可以分发了。
  • 在当前情况下, 所有垃圾收集器都是分代的, 因此是最佳的。

注意:System.gc()和Runtime.gc()是显式向JVM请求垃圾收集的方法, 但它不能确保垃圾收集, 因为垃圾收集的最终决定仅取决于JVM。

了解程序及其数据的存储或组织方式非常重要, 因为当程序员打算在资源和消耗方面编写优化的代码时, 这将有所帮助。它还有助于发现内存泄漏或不一致, 并有助于调试与内存相关的错误。但是, 内存管理概念极为广泛, 因此必须尽最大努力研究它, 以提高其知识。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: