什么是堆?
堆(heap),一个JVM只能由一个堆内存,堆内存是可以调节的。
类加载器读取类文件后,会把什么存放到堆中? 实例,方法区/元空间。
堆又分为新时代和老年代以及元空间。
JVM调优大部分都是在调堆。

1、新生代
分为伊甸园、幸存区0与幸存区1。
伊甸园
垃圾回收主要区域,当对象没有被引用后会被轻GC回收。
幸存区0与幸存区1
在伊甸园没有被轻GC回收的,幸存下来的对象会存放在幸存区0与幸存区1。
幸存区0与幸存区1 是动态的,它两会互换位置,比如1变成0,0变成1.
2、老年代
当伊甸园、幸存区0与幸存区1 都满了,就会到老年代,老年代是重GC 回收机制。
如果老年代和新生代都满了就会报内存溢出:OutOfMemoryError
修改堆内存与输出堆信息
1、设置JVM的初始内存和最大内存

//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
//初始内存 最大内存 输出GC回收信息
//-XX:+HeapDumpOnOutOfMemoryError 出现OOM异常则Dump
可以使用Runtime类查看当前的JVM内存信息
public class Main {
public static void main(Test[] args) throws ClassNotFoundException {
//jvm 试图使用的最大内存
long maxMemory = Runtime.getRuntime().maxMemory();
//jvm 使用的初始总内存
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println(maxMemory+"字节"+maxMemory/(double)1024/1024);
System.out.println(totalMemory+"字节"+totalMemory/(double)1024/1024);
}
}
项目出现了OOM怎么排除?
- 能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler
- Debug,一行行代码分析
MAT,Jprofiler作用?
- 分析Dump内存文件,快速定位内存泄漏
- 获得堆中的数据
- 获得大的对象
- …
怎么使用?
安装IDEAJprofiler 插件,安装Jprofiler软件
之后修改JVM参数
-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError
出现OOM异常在项目目录会创建一个.hprof后缀的文件。

然后打开这个文件,可以看到出现问题的位置。


441

被折叠的 条评论
为什么被折叠?



