#yyds干货盘点# Java 内存分析之堆内存和MetaSpace内存

Posted 灰太狼_cxh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# Java 内存分析之堆内存和MetaSpace内存相关的知识,希望对你有一定的参考价值。

Java 内存分析之堆内存和MetaSpace内存

常见的内存溢出问题(内存和MetaSpace内存)

Java 堆内存溢出

Java 堆内存(Heap Memory)主要有两种形式的错误:

OutOfMemoryError: Java heap space

OutOfMemoryError: GC overhead limit exceeded

OutOfMemoryError: Java heap space

在 Java 堆中只要不断的创建对象,并且 GC-Roots 到对象之间存在引用链,这样 JVM 就不会回收对象。

只要将-Xms(最小堆),-Xmx(最大堆) 设置为一样禁止自动扩展堆内存。

当使用一个 while(true) 循环来不断创建对象就会发生 OutOfMemory,还可以使用 -XX:+HeapDumpOutofMemoryErorr 当发生 OOM 时会自动 dump 堆栈到文件中。

伪代码:

public static void main(String[] args) 
List<String> list = new ArrayList<>(10) ;
while (true)
list.add("1") ;


OutOfMemoryError: GC overhead limit exceeded

GC overhead limt exceed检查是Hotspot VM 1.6定义的一个策略,通过统计GC时间来预测是否要OOM了,提前抛出异常,防止OOM发生。Sun 官方对此的定义是:“并行/并发回收器在GC回收时间过长时会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。用来避免内存过小造成应用不能正常工作。“

PS:-Xmx最大内存配置2GB

可以使用 -XX:+HeapDumpOutofMemoryErorr 当发生 OOM 时会自动 dump 堆栈到文件中。

JVM还有这样一个参数:-XX:-UseGCOverheadLimit 设置为false可以禁用这个检查。其实这个参数解决不了内存问题,只是把错误的信息延后,替换成 java.lang.OutOfMemoryError: Java heap space。

MetaSpace (元数据) 内存溢出

JDK8 中将永久代移除,使用 MetaSpace 来保存类加载之后的类信息,字符串常量池也被移动到 Java 堆。

PermSize 和 MaxPermSize 已经不能使用了,在 JDK8 中配置这两个参数将会发出警告。

JDK 8 中将类信息移到到了本地堆内存(Native Heap)中,将原有的永久代移动到了本地堆中成为 MetaSpace ,如果不指定该区域的大小,JVM 将会动态的调整。

可以使用 -XX:MaxMetaspaceSize=10M 来限制最大元数据。这样当不停的创建类时将会占满该区域并出现 OOM。

以上是关于#yyds干货盘点# Java 内存分析之堆内存和MetaSpace内存的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#java内存模型之final域的内存语义

从JVM堆内存分析验证深浅拷贝#yyds干货盘点#

为什么要“除夕”,原来是内存爆了#yyds干货盘点#

通过JConsoler监控Tomcat的JVM内存 #yyds干货盘点#

#yyds干货盘点# 醒酒菜:动画图解核心内存区--堆

#yyds干货盘点#常见的JavaScript内存错误