Garbage collection Java中的总内存是如何计算的

Garbage collection Java中的总内存是如何计算的,garbage-collection,jvm,heap,Garbage Collection,Jvm,Heap,如果我有8GB的RAM,并且我在64位JVM上使用以下命令 最大堆大小6144MB 最大永久发电机空间2048MB 堆栈大小2MB Q1:perm gen空间是从max heap分配的,还是单独分配的 Q2:如果分开,则具有上述设置的jvm将启动,或者会出现错误,因为heap+permgen+stack+程序数据将高于总RAM?heap和permgen是jvm的不同内存部分。因此,您将消耗系统上几乎所有的内存。最好留出20%的ram,以便操作系统/其他任务正常执行 另外,2 gb的perm空

如果我有8GB的RAM,并且我在64位JVM上使用以下命令

  • 最大堆大小6144MB
  • 最大永久发电机空间2048MB
  • 堆栈大小2MB
Q1:perm gen空间是从max heap分配的,还是单独分配的


Q2:如果分开,则具有上述设置的jvm将启动,或者会出现错误,因为heap+permgen+stack+程序数据将高于总RAM?

heap和permgen是jvm的不同内存部分。因此,您将消耗系统上几乎所有的内存。最好留出20%的ram,以便操作系统/其他任务正常执行


另外,2 gb的perm空间是一个巨大的数字。您是否看过jar优化,这意味着只有相关的类存在于类路径中?

这取决于JVM和JVM的版本

  • 在HotspotJava6中,PermGen空间独立于max heapsize参数(
    -Xmx
    -Xms
    仅控制年轻/老代的大小)。永久空间大小由
    -XX:PermSize
    -XX:MaxPermSize
    给出。看

  • 更新:在HotspotJava 8中,不再有PermGen空间了,对象驻留在年轻/老一代空间中


首先,请记住,您使用
-Xmx
设置的参数(因为我认为这是设置堆大小的方式)是Java代码可用的堆大小,而不是JVM将消耗的内存量。区别来自JVM保持的内务管理结构(垃圾收集器结构、JIT开销等),有时是由本机代码、缓冲区等分配的内存。这个额外内存的大小取决于JVM版本、正在运行的应用程序以及其他因素,但我看到JVM分配的RAM是应用程序可见堆大小的两倍。一般情况下,我通常认为50%是安全边际,20%到30%是可以接受的。如果您将堆大小设置为接近计算机中的RAM数量,则会遇到交换,性能将受到影响

下面是列举的问题:

至少在Oracle的JDK 6中,Perm gen是一个独立于堆的空间。它是独立的,因为它所经历的内存管理规则与常规堆完全不同。顺便说一下,2GB的pergen空间非常大-你确定你真的需要它吗


关于第二个问题,见上文。如果这是Oracle的JDK,您可能会遇到麻烦,因为perm和heap相加,但会有额外的内存,通常是6 GB堆的20-50%,加上heap和perm空间,这将超过您的RAM。首先尝试此设置可能会起作用,但一旦堆和perm gen空间使用接近其配置的限制,您可能会耗尽内存。

thx。。。尺寸是指示性的。。。但你可以在某个地方读到permgen是堆外保留的空间。。。我认为还需要考虑很多其他内存需求,比如每个线程的堆栈和每个jvm实例的其他内存需求。。。什么是jar优化?jvm不能使用类似操作系统的交换。。。与可怕的OOM错误相反,PermGen在Java8中被完全删除,而不是在Java7中。在Java7中,只从PermGen中删除了内部字符串,类元数据仍然存在。看见