jvm 内存机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm 内存机制相关的知识,希望对你有一定的参考价值。

jvm 的内存包括stack ,Heap,NonHeap,在此重点说明Heap,NonHeap。

Heap叫堆内存,它用于存放类实例和数组信息。NonHeap叫非堆内存,用于存放类,方法等可反射的对象以及类静态变量,常量池等。

Heap包含年轻态,年老态。NonHeap包含永久态。年轻态包含1个eden去和2个survivor区。

内存区域的大小均有相应的参数配置。各个参数详解如下:

a) 堆内存设置:程序可以操作的。

-Xms 初始化堆内存,默认是物理内存的1/64。当空余堆内存小于40%时,会增加到-Xmx的最大限制。

-Xmx 最大堆内存分配,默认是物理内存的1/4,当空余内存大于70%时,会减少到-Xms的最大限制。

一般,Xmx 和Xms 一般大小相等。

b)非堆内存设置

-XX:PermSize 初始化非堆内存,默认是物理内存的1/64。

-XX:MaxPermSize 非堆内存最大值,默认是物理内存的1/4。

申请内存的过程:

1.jvm优先分配在eden区,若eden空间足够,则内存申请结束。

2.否则jvm试图释放eden区的不活跃的对象(minor gc),释放后若eden仍不足放入新的对象,则jvm试图将部分eden区活跃对象放入survivor区。

3.若survivor不足以存放且old区有足够的空间存放,则直接存放到old区并将survivor区的对象移到old区。

4.若old空间不足,则进行full gc。

5.若回收后survivor及old区仍不足以存放从Eden复制过来的部分对象,导致jvm无法在eden区为新对象分配内存,则出现OOM错误。

GC内存回收的机制:

 

JVM内出现OOM,查找步骤如下:

1.确认是不是内存本身就分配过小

jmap -heap pid(pid是进程的id),该工具可以查出新生代,年老代堆内存的分配大小及使用情况

2.找到最耗内存的对象

jmap -histo:hive pid|more

但是,该执行该命令会执行一次fgc,可以执行该命令后dump内存,通过mat分析(如visualVm,jprofiler,JProbe等)

 

以上是关于jvm 内存机制的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存模型和类加载运行机制

JVM内存管理机制和垃圾回收机制

jvm内存回收机制

详解JVM内存管理与垃圾回收机制 (上)

JVM ---- 大白话图文之JVM类加载机制内存区域垃圾回收

JVM ---- 大白话图文之JVM类加载机制内存区域垃圾回收