1.堆
1.1堆的内存结构
新生代
永久代
1.2 调参数
1.2.1默认参数
public class Test01 {
public static void main(String[] args) {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println(maxMemory/1024/1024);//试图使用的最大内存:1794(默认为电脑内存的1/4)
System.out.println(totalMemory/1024/1024);//初始化内存:123(默认为电脑内存的1/64)
}
//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
}
1.2.2调参数,写死循环,看垃圾回收
//调参数:-Xms1m -Xmx1m -XX:+PrintGCDetails
public class Test02 {
public static void main(String[] args) {
while (true){
int[] arr = new int[0x3f3f3f];
}
}
}
1.3 JPofiler工具分析OOM原因
1.3.1 装JProfiler
1.下载插件
2.官网下载
JProfiler - Download (softonic.com)
3. 安装,无脑next
4.idea里面配一下
1.3.2 使用JProfiler
1.准备工作:改参数、写死循环
import java.util.ArrayList;
//需要改的参数:-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError
public class Test03 {
public static void main(String[] args) {
ArrayList<Test03> arr = new ArrayList<>();
int count =0;
try {
while (true) {
arr.add(new Test03());
count++;
}
} catch (Error e) {
System.out.println("count:"+count);
}
/*
控制台输出
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid26044.hprof ...
Heap dump file created [2553641 bytes in 0.013 secs]
count:31618
*/
}
}
2. 找到.hprof文件
3.看.hprof文件(看完后记得删掉)
2.方法区
2.1方法区放的东西
2.2方法区
2.3 运行时常量池
4.字符串常量池(StringTable)
4.1位置
JDK1.7以前 :
运行时常量池(包含字符串常量池)——在方法区——永久代实现
JDK1.7:
字符串常量池——被拿到堆中
运行时常量池剩余部分——在方法区——永久代实现
JDK1.8:
字符串常量池——还在堆中
运行时常量池剩余部分——在方法区——元空间实现
4.2 特性