Spring 可缓存对象存储在哪里?



我正在项目中使用 Spring 缓存,我想使用 visualVM 分析 java 内存,我想知道缓存对象在哪里

  1. 真的存储在堆中吗?
  2. 有没有存放在伊甸园记忆中?

谢谢。

不可能知道任何对象的存储位置,而不仅仅是 Spring 对象。对象可能位于伊甸园、幸存者空间或永久状态中。在 JDK 7 或更早版本中,某些东西(如类(存储在 perm gen 中(根据这篇 Oracle 博客文章:">JDK 8 中永久生成已被完全删除"(。

垃圾收集器可以并且将会在盖子下移动物体。何时以及如何发生这种情况取决于您使用的特定垃圾回收器、用于指定 GC 行为的标志,以及应用程序的其余部分对内存执行的操作(读取和写入(。

伊甸园、幸存者和终身制都在堆上。对于较旧的 JVM,一些东西将在堆外的 perm gen 中分配。有关更多详细信息,请查看本文档中有关 JConsole 使用情况的"监视内存消耗"。

同样来自该文档,这是堆与非堆的一个很好的总结:

堆和非堆内存

Java VM管理两种类型的内存:堆内存和非堆内存,这两种内存都是在 Java VM 启动时创建的。

  • 堆内存是运行时数据区域,Java VM 从中为所有类实例和数组分配内存。堆可以是固定大小,也可以是可变大小。垃圾回收器是一种自动内存管理系统,用于回收对象的堆内存。

  • 非堆内存包括在 Java VM 的内部处理或优化所需的所有线程和内存之间共享的方法区域。它存储每个类结构,如运行时常量池,字段和方法数据,以及方法和构造函数的代码。方法区域在逻辑上是堆的一部分,但根据实现的不同,Java VM 可能不会对其进行垃圾回收或压缩。与堆内存一样,方法区域可以是固定大小,也可以是可变大小。方法区域的内存不需要是连续的。

最新更新