4个月前 (11-16)  jvm |   抢沙发  231 
文章评分 2 次,平均分 1.0

Java内存模型的内部结构取决于使用哪个JVM,尽管在高层的情况是相似的。JVM中有两个主要的内存区域—堆和堆栈。局部变量和方法驻留在堆栈上,其他的都在堆上。

Java堆内存结构

Java堆内存分为不同的区域,称为代:

  • 年轻一代(伊甸园Eden和幸存者Survivor空间)
  • 老一代(终身空间)
  • 永久代(permGen)

当一个新的物体第一次被创造出来时,它就属于年轻一代。当年轻一代填满时,它会导致一个小的垃圾回收(GC)。一些在GC中幸存的对象已老化。一个物体存活的时间越长,它就会一直移动到老一代(在临界年龄之后)。所以,老一代人储存着长期存在的物品。在某些时候,旧的一代也需要被收集,这会导致一个主要的垃圾收集。年轻一代比老一代更频繁地被垃圾收集。

jvm元空间存哪些数据

permGen中的对象是相对永久的。类定义(应用程序类和JavaSE库类)和静态变量存储在这个内存中。永久的一代在完全垃圾收集中被收集。对象的确切删除逻辑取决于使用哪个JVM。

注意:使用Java8perm gen将被完全删除。它被元空间metaspace所取代

同样,在Java8中,Oracle(Sun)hotspots jvm和oracle jrockit JVM是聚合的。

Java静态变量存储在内存中的什么位置?

静态成员变量存储在堆的永久生成区域中。这是因为static不属于对象而是属于类,所以它被认为是类定义的一部分。如果静态变量是基元类型,它们将存储在permGen中。如果静态变量是一个引用变量,例如static Person obj=new Person(),那么reference变量obj将被存储在permGen中,新创建的objected将被放置在年轻一代中。

permGen和Metaspace有什么区别?

您可能知道,在Java8中,permGen被Metaspace取代。

它们之间有许多不同之处,主要有两个:

  • 元空间metaspace可以在运行时扩展。
  • 元空间metaspace是本机内存的一部分,而permGen是堆的一部分。

甲骨文在Java8中已经完全摆脱了PermGen,取而代之的是Metaspace

什么是PermGen?

PermGen是永久代的缩写,是堆中JVM用来存储类和方法对象的内存区域。如果应用程序加载了很多类,PermGen的利用率将很高。PermGen还掌握着“被拘留”的绳子

PermGen空间的大小由Java命令行选项-XX:MaxPermSize配置

对于大多数应用程序来说,256MB的PermGen空间应该足够了

然而,看到错误并不是不寻常的。”java.lang.OutOfMemoryError:PermGen space“如果加载的类数不正常。

由于PermGen空间而出现内存不足错误的日子一去不复返了。对于Java8,没有PermGen。没错。所以不会再有由于PermGen导致的内存外错误

PermGen和Metaspace的关键区别在于:PermGen是Java堆的一部分(通过-Xmx选项配置的最大大小),而Metaspace不是Heap的一部分。相反,Metaspace是本机内存(进程内存)的一部分,它只受主机操作系统的限制

jvm元空间存哪些数据

更多关于元空间的数据结构可以参考这篇文章:https://javakk.com/395.html

那么,这一变化的意义是什么呢?

虽然不会再耗尽PermGen空间(因为没有PermGen),但您可能会消耗过多的本机内存,从而使整个进程的大小变大。

metaspace中存放内容,如果您的应用程序加载了大量的类(或内部字符串),您实际上可能会关闭整个服务器(不仅仅是您的应用程序)。为什么?因为本机内存只受操作系统的限制。这意味着您可以占用服务器上的所有内存。这是很危险的一件事。

添加新选项-XX:MaxMetaspaceSize为应用程序设置最大元空间大小,这一点非常重要。

请注意,仅仅监视堆大小已经不够了。您还必须监视元空间,您可以使用操作系统实用程序监视“进程大小”(例如,在Unix/Linux中为“top”,在Windows中为“Task Manager”)。

您可以使用jmap命令打印当前Java8之前的应用程序的内存统计信息。

jmap-permstat<PID>

在Java8中,PermGen消失了,Metaspace加入了。Metaspace是本机内存的一部分,而不是Java堆的一部分。虽然在应用程序的开发阶段,这种更改可能并不重要,但在进入生产阶段时考虑这一点是非常重要的,因为如果应用程序占用了过多的元空间,则不仅会导致应用程序停机,还会导致整个服务器停机

确保应用程序管理员和QA知道这一重大变化,并确保在QA阶段(负载测试)和生产过程中进行充分的监控。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/837.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册