新生区
- 类:诞生和成长的地方,甚至死亡
- 伊甸园区,所有的对象都是在伊甸园区new出来的
- 幸存者区(0,1)
老年区
经过研究,99%的对象都是临时对象
永久区
这个区域常驻内存的,用来存放JDK自身携带的Class对象。interface元数据,存储的是java运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭虚拟机就会释放这个区域的内存
一个启动类,加载了大量的第三方jar包。Tomcat部署了太多的应用,大量动态生成的反射类。不断地被加载,直到内存满了,就会出现OOM
jdk1.6之前:永久代,常量池在方法区
jdk1.7 :永久代,但是慢慢的退化了,去永久代,常量池在堆中
jdk1.8 :无永久代,常量池在元空间
元空间:逻辑上存在,物理上不存在
package com.faq;
public class Demo2 {
public static void main(String[] args) {
//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();//字节 1024*1024
//返回jvm的初始化总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB");
}
//默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:1/64
//7.7
//~1/4
//OOM:
//1.尝试扩大内存看结果
//2.分析内存,看一下哪个地方出现了问题(专业工具)
//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
}
![(E:\JAVA\java学习笔记\JVM\思维导图\内存调试.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vzolyUfv-1617103822459)(E:\JAVA\java学习笔记\JVM\思维导图\内存调试.png)]
package com.faq;
import java.util.Random;
//-Xms8m -Xmx8m -XX:+PrintGCDetails
public class Hello {
public static void main(String[] args) {
String str ="kuangshenshuojava";
while(true){
str += str + new Random().nextInt(888888888)+new Random().nextInt(99999999);
}
}
}
输出:
[GC (Allocation Failure) [PSYoungGen: 1536K->488K(2048K)] 1536K->640K(7680K), 0.0327592 secs] [Times: user=0.00 sys=0.00, real=0.03 secs] //轻GC
[GC (Allocation Failure) [PSYoungGen: 1893K->496K(2048K)] 2045K->928K(7680K), 0.0008436 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1926K->495K(2048K)] 2358K->1343K(7680K), 0.0007825 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1643K->288K(2048K)] 3579K->2767K(7680K), 0.0010120 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 875K->288K(2048K)] 4442K->3863K(7680K), 0.0007268 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 288K->256K(2048K)] 3863K->3831K(7680K), 0.0004091 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 256K->0K(2048K)] [ParOldGen: 3575K->2221K(5632K)] 3831K->2221K(7680K), [Metaspace: 3277K->3277K(1056768K)], 0.0057339 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] //重GC
[Full GC (Ergonomics) [PSYoungGen: 1166K->0K(2048K)] [ParOldGen: 5485K->2766K(5632K)] 6652K->2766K(7680K), [Metaspace: 3302K->3302K(1056768K)], 0.0073002 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 61K->96K(2048K)] 5003K->5037K(7680K), 0.0006968 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 96K->64K(2048K)] 5037K->5005K(7680K), 0.0002639 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 64K->0K(2048K)] [ParOldGen: 4941K->3878K(5632K)] 5005K->3878K(7680K), [Metaspace: 3307K->3307K(1056768K)], 0.0060809 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
at java.lang.StringBuilder.append(StringBuilder.java:208)
at com.faq.Hello.main(Hello.java:10)
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)] 3878K->3878K(7680K), 0.0003874 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)] [ParOldGen: 3878K->3858K(5632K)] 3878K->3858K(7680K), [Metaspace: 3307K->3307K(1056768K)], 0.0062870 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
PSYoungGen total 2048K, used 45K [0x00000000ffd80000, 0x0000000100000000, 0x0000000100000000)
eden space 1536K, 2% used [0x00000000ffd80000,0x00000000ffd8b6d8,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
to space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
ParOldGen total 5632K, used 3858K [0x00000000ff800000, 0x00000000ffd80000, 0x00000000ffd80000)
object space 5632K, 68% used [0x00000000ff800000,0x00000000ffbc4ab0,0x00000000ffd80000)
Metaspace used 3339K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 363K, capacity 388K, committed 512K, reserved 1048576K