Java内存区域与内存溢出异常
概述
C\C++
- 内存管理区域的土皇帝
Java
new操作不需要去写配对的delete代码
不容易内存泄漏和内存溢出
内存泄漏
Memory Leak
程序动态申请的堆内存没有释放或者无法释放,后果可能是运行变慢,也可能是程序崩溃。问题具有积累性。内存溢出
Out of Memory
意思是内存不够了,你要加内存条了。
内存泄漏可能会导致内存溢出。
一旦泄漏或溢出,不懂JVM没办法Debug
运行时数据区域
JVM会把她管理的内存划分为若干个区域
程序计数器
特点
- 占用内存空间较少
- 线程私有
作用
告诉当前线程应该执行哪一行字节码
- 比如一个条件语句之后的跳转就可以通过设置程序计数器来实现,循环,异常处理也是如此
多线程的实现
- 线程轮流切换
- 分配处理器执行时间
- 每个线程要有自己独立的程序计数器
值
执行java方法
- 正在执行的字节码的地址
执行native方法
A native method is a Java method whose implementation is provided by non-java code.
- null
java虚拟机栈
特点
- 生命周期和线程相同
- 线程私有
作用
描述java方法执行的内存模型
栈帧
内容
局部变量表
基本数据类型
对象引用
- 对象引用不等同于对象本身,可能是指向对象起始地址的指针,这个指针也可能指向其他和这个对象相关的位置
returnAddress类型
- 指向字节码的指针
特点
方法被执行时创建
方法执行完成
- 出栈
方法被调用
- 入栈
笼统的内存划分
栈内存
- 这个栈内存就指的是虚拟机栈
堆内存
异常
虚拟机栈不可以动态扩展
- 线程请求的栈深度大于虚拟机所允许的深度会抛出StackOverFlowError
虚拟机栈可以动态扩展
- 扩展时会申请内存,申请不到内存会抛出OutOfMemory异常
本地方法栈
作用
- 和Java虚拟机栈类似,只不过为Native Method服务
异常
- 和java虚拟机栈一样
有的虚拟机(如HotSpot)把本地方法栈和jvm栈合二为一,不做区别
Java堆
特点
jvm管理内存里最大的一块
所有线程共享
JVM启动时创建
垃圾收集器管理的主要区域
因此得名GC堆(Garbage Collected heap)
为什么不翻译成垃圾堆?哈哈哈哈哈
内存空间在物理上可以不连续,逻辑上要连续
主流JVM的java heap可以扩展
作用
- 存放对象实例以及数组
垃圾收集器
- 分代收集算法
分类
粗分
- 新生代
- 老生代
细分
- Eden空间
- From Survivor空间
- To Survivor空间
异常
方法区
有个别名叫Non Heap,许多人称之为永久代
特点
线程共享
不需要物理上连续的内存
大小可扩展
可以选择不进行垃圾回收
- 回收成果难以令人满意
- 不回收可能会导致内存泄漏
作用
- 已经被jvm加载的类信息
- 常量
- 静态变量
- 即时编译器编译后的代码
异常
- OutOfMemoryError
运行常量池
方法区的一部分
Class文件
类的版本
字段
方法
接口
常量池(Constant Pool Table)
编译器生成的字面量、符号量
字面量: literal
我理解是这样的,比如int n = 2;这个2就是n的字面量,再比如我有个Hero类,类中有许多属性,所以我不能直接Hero tracer = “tracer”,这就没有字面量。意思就是能表示出来的就是字面量。
符号量:Symbolic References
我觉得这个翻译并不恰当,我还以为这个符号指的是感叹号问号那一类的符号。
其实是这样的,在编译期间,编译器可能不知道我的某个类的具体位置,比如我的某个method里有个Undefined类(名字我瞎起的),编译器起初并不知道这个Undefined类在哪里,所以索性先用Undefined这个“符号”标记,以后再说。与之相对的是直接引用,直接应用可以是直接指向变量的指针之类的这部分内容会在类加载后存放到方法区的运行常量池里
翻译出的直接引用也会存到运行常量池里
动态性
运行期间新的常量也可能放入运行常量池中
栗子
1
2
3
4
5
6
7
8
9
10
11
12public class Main {
public static void main(String[] args) {
String s1 = new String("intern?");
String s2 = new String("intern?");
System.out.println(s1 == s2); //false
String s3 = s1.intern();
String s4 = "intern?";
System.out.println(s3 == s4); //true
}
}String类的intern方法
- new出来的String会被放在java Heap里
- 通过字面量对String初始化,她会先在运行常量池里寻找,找到则返回池里的引用,否则就在池里创建一个并返回引用。
- new出来的String调用intern方法会把自己的引用添加到运行常量池里
异常
- OutOfMemoryError
直接内存
特点
不属于JVM运行时数据区域
既然不属于,为什么要归在这类呢?原因是这个内存区域访问也很多,也可能OutOfMemory,所以一起看啦。
异常
- 既然不属于JVM运行时数据区域,当然不会受到java heap大小的限制,但是会受到电脑物理内存的限制。有些服务器管理员设置参数的时候,直接把直接内存忽略掉了,结果是因为没考虑到直接内存,所以使各个区域内存总和大于物理内存的限制,动态扩展时可能OutOfMemoryError
对象访问
栗子
- Object object = new Object();
- new出来的Object实例放在java heap里
- 左边这个reference放在jvm stack里
- 实例还需要一些关于类的信息(可能是为了反射?idk),这些信息放在方法区
引用的定位方式
jvm规范只要求这个reference要指向对象,但没说怎么去定位。不同虚拟机定位方式或许不同。
句柄(handle)
- java heap中再分出一块内存作为句柄池
- reference中存储对象的句柄地址
- 句柄里有对象实例数据的地址和类型数据的地址
直接指针
- reference中存储对象的实例数据的地址
- 实例数据里包含类型数据的地址
两种定位方式的优劣
用句柄的话,移动对象不需要改变reference,只需要改变句柄中的实例数据地址
用直接指针的话,访问对象的时候比用句柄少一次指针定位的时间,积少成多,而且访问对象是很频繁的操作。
Sun HotSpot用的直接指针定位
OutOfMemory异常
java堆溢出
栗子
java堆里存的是对象实例,只要一直new对象,就会产生内存溢出异常
1
2
3
4
5
6
7
8
9
10public class Main {
//-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
public static void main(String[] args) {
List<String> list = new LinkedList<>();
while (true) {
String s = new String("stack over flow");
list.add(s);
}
}
}运行结果
D:\Software\Java\jdk-14\bin\java.exe -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 “-javaagent:D:\Software\JetBrains\IntelliJ IDEA 2019.2.2\lib\idea_rt.jar=49458:D:\Software\JetBrains\IntelliJ IDEA 2019.2.2\bin” -Dfile.encoding=UTF-8 -classpath D:\Software\Java\javafx-sdk-11.0.2\lib;D:\Software\Java\javafx-sdk-11.0.2\bin;D:\Project\IdeaProjects\JVM\out\production\JVM eternal.fire.Main
[0.017s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
[0.027s][info ][gc,heap] Heap region size: 1M
[0.027s][info ][gc,heap,coops] Heap address: 0x00000000fec00000, size: 20 MB, Compressed Oops mode: 32-bit
[0.029s][info ][gc ] Using G1
[0.052s][info ][gc ] Periodic GC disabled
[0.142s][info ][gc,start ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
[0.142s][info ][gc,task ] GC(0) Using 2 workers of 4 for evacuation
[0.162s][info ][gc,phases ] GC(0) Pre Evacuate Collection Set: 0.0ms
[0.162s][info ][gc,phases ] GC(0) Merge Heap Roots: 0.0ms
[0.162s][info ][gc,phases ] GC(0) Evacuate Collection Set: 19.2ms
[0.162s][info ][gc,phases ] GC(0) Post Evacuate Collection Set: 0.2ms
[0.162s][info ][gc,phases ] GC(0) Other: 0.2ms
[0.162s][info ][gc,heap ] GC(0) Eden regions: 10->0(8)
[0.162s][info ][gc,heap ] GC(0) Survivor regions: 0->2(2)
[0.162s][info ][gc,heap ] GC(0) Old regions: 0->7
[0.162s][info ][gc,heap ] GC(0) Archive regions: 0->0
[0.162s][info ][gc,heap ] GC(0) Humongous regions: 0->0
[0.162s][info ][gc,metaspace ] GC(0) Metaspace: 828K(4864K)->828K(4864K) NonClass: 752K(4352K)->752K(4352K) Class: 76K(512K)->76K(512K)
[0.162s][info ][gc ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 10M->8M(20M) 19.717ms
[0.162s][info ][gc,cpu ] GC(0) User=0.03s Sys=0.00s Real=0.02s
[0.164s][info ][gc,start ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
[0.164s][info ][gc,task ] GC(1) Using 2 workers of 4 for evacuation
[0.195s][info ][gc ] GC(1) To-space exhausted
[0.195s][info ][gc,phases ] GC(1) Pre Evacuate Collection Set: 0.0ms
[0.195s][info ][gc,phases ] GC(1) Merge Heap Roots: 0.1ms
[0.195s][info ][gc,phases ] GC(1) Evacuate Collection Set: 24.8ms
[0.195s][info ][gc,phases ] GC(1) Post Evacuate Collection Set: 6.1ms
[0.195s][info ][gc,phases ] GC(1) Other: 0.1ms
[0.195s][info ][gc,heap ] GC(1) Eden regions: 8->0(9)
[0.195s][info ][gc,heap ] GC(1) Survivor regions: 2->1(2)
[0.195s][info ][gc,heap ] GC(1) Old regions: 7->18
[0.195s][info ][gc,heap ] GC(1) Archive regions: 0->0
[0.195s][info ][gc,heap ] GC(1) Humongous regions: 0->0
[0.195s][info ][gc,metaspace ] GC(1) Metaspace: 860K(4864K)->860K(4864K) NonClass: 776K(4352K)->776K(4352K) Class: 83K(512K)->83K(512K)
[0.195s][info ][gc ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 16M->19M(20M) 31.208ms
[0.195s][info ][gc,cpu ] GC(1) User=0.05s Sys=0.02s Real=0.03s
[0.196s][info ][gc,start ] GC(2) Pause Young (Concurrent Start) (G1 Evacuation Pause)
[0.196s][info ][gc,task ] GC(2) Using 2 workers of 4 for evacuation
[0.206s][info ][gc ] GC(2) To-space exhausted
[0.206s][info ][gc,phases ] GC(2) Pre Evacuate Collection Set: 0.0ms
[0.206s][info ][gc,phases ] GC(2) Merge Heap Roots: 0.1ms
[0.206s][info ][gc,phases ] GC(2) Evacuate Collection Set: 7.6ms
[0.206s][info ][gc,phases ] GC(2) Post Evacuate Collection Set: 2.5ms
[0.206s][info ][gc,phases ] GC(2) Other: 0.1ms
[0.206s][info ][gc,heap ] GC(2) Eden regions: 1->0(10)
[0.206s][info ][gc,heap ] GC(2) Survivor regions: 1->0(0)
[0.206s][info ][gc,heap ] GC(2) Old regions: 18->20
[0.206s][info ][gc,heap ] GC(2) Archive regions: 0->0
[0.206s][info ][gc,heap ] GC(2) Humongous regions: 0->0
[0.206s][info ][gc,metaspace ] GC(2) Metaspace: 863K(4864K)->863K(4864K) NonClass: 779K(4352K)->779K(4352K) Class: 84K(512K)->84K(512K)
[0.206s][info ][gc ] GC(2) Pause Young (Concurrent Start) (G1 Evacuation Pause) 20M->20M(20M) 10.425ms
[0.206s][info ][gc,cpu ] GC(2) User=0.03s Sys=0.00s Real=0.01s
[0.206s][info ][gc ] GC(3) Concurrent Cycle
[0.206s][info ][gc,task ] GC(4) Using 2 workers of 4 for full compaction
[0.206s][info ][gc,marking ] GC(3) Concurrent Clear Claimed Marks
[0.206s][info ][gc,marking ] GC(3) Concurrent Clear Claimed Marks 0.010ms
[0.206s][info ][gc,marking ] GC(3) Concurrent Scan Root Regions
[0.206s][info ][gc,marking ] GC(3) Concurrent Scan Root Regions 0.005ms
[0.206s][info ][gc,marking ] GC(3) Concurrent Mark (0.206s)
[0.206s][info ][gc,marking ] GC(3) Concurrent Mark From Roots
[0.206s][info ][gc,task ] GC(3) Using 1 workers of 1 for marking
[0.206s][info ][gc,start ] GC(4) Pause Full (G1 Evacuation Pause)
[0.207s][info ][gc,phases,start] GC(4) Phase 1: Mark live objects
[0.222s][info ][gc,phases ] GC(4) Phase 1: Mark live objects 15.531ms
[0.222s][info ][gc,phases,start] GC(4) Phase 2: Prepare for compaction
[0.225s][info ][gc,phases ] GC(4) Phase 2: Prepare for compaction 3.259ms
[0.226s][info ][gc,phases,start] GC(4) Phase 3: Adjust pointers
[0.230s][info ][gc,phases ] GC(4) Phase 3: Adjust pointers 4.823ms
[0.230s][info ][gc,phases,start] GC(4) Phase 4: Compact heap
[0.234s][info ][gc,phases ] GC(4) Phase 4: Compact heap 3.391ms
[0.234s][info ][gc,heap ] GC(4) Eden regions: 0->0(10)
[0.234s][info ][gc,heap ] GC(4) Survivor regions: 0->0(0)
[0.234s][info ][gc,heap ] GC(4) Old regions: 20->19
[0.234s][info ][gc,heap ] GC(4) Archive regions: 0->0
[0.234s][info ][gc,heap ] GC(4) Humongous regions: 0->0
[0.234s][info ][gc,metaspace ] GC(4) Metaspace: 863K(4864K)->863K(4864K) NonClass: 779K(4352K)->779K(4352K) Class: 84K(512K)->84K(512K)
[0.234s][info ][gc ] GC(4) Pause Full (G1 Evacuation Pause) 20M->17M(20M) 27.490ms
[0.234s][info ][gc,cpu ] GC(4) User=0.06s Sys=0.00s Real=0.03s
[0.234s][info ][gc,marking ] GC(3) Concurrent Mark From Roots 27.911ms
[0.234s][info ][gc,marking ] GC(3) Concurrent Mark Abort
[0.234s][info ][gc ] GC(3) Concurrent Cycle 27.980ms
[0.235s][info ][gc,start ] GC(5) Pause Young (Normal) (G1 Evacuation Pause)
[0.235s][info ][gc,task ] GC(5) Using 2 workers of 4 for evacuation
[0.239s][info ][gc ] GC(5) To-space exhausted
[0.239s][info ][gc,phases ] GC(5) Pre Evacuate Collection Set: 0.0ms
[0.239s][info ][gc,phases ] GC(5) Merge Heap Roots: 0.0ms
[0.239s][info ][gc,phases ] GC(5) Evacuate Collection Set: 2.7ms
[0.239s][info ][gc,phases ] GC(5) Post Evacuate Collection Set: 1.5ms
[0.239s][info ][gc,phases ] GC(5) Other: 0.1ms
[0.239s][info ][gc,heap ] GC(5) Eden regions: 1->0(10)
[0.239s][info ][gc,heap ] GC(5) Survivor regions: 0->0(0)
[0.239s][info ][gc,heap ] GC(5) Old regions: 19->20
[0.239s][info ][gc,heap ] GC(5) Archive regions: 0->0
[0.239s][info ][gc,heap ] GC(5) Humongous regions: 0->0
[0.239s][info ][gc,metaspace ] GC(5) Metaspace: 877K(4864K)->877K(4864K) NonClass: 791K(4352K)->791K(4352K) Class: 85K(512K)->85K(512K)
[0.239s][info ][gc ] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 18M->18M(20M) 4.331ms
[0.239s][info ][gc,cpu ] GC(5) User=0.00s Sys=0.00s Real=0.00s
[0.239s][info ][gc,task ] GC(6) Using 2 workers of 4 for full compaction
[0.239s][info ][gc,start ] GC(6) Pause Full (G1 Evacuation Pause)
[0.239s][info ][gc,phases,start] GC(6) Phase 1: Mark live objects
[0.260s][info ][gc,phases ] GC(6) Phase 1: Mark live objects 20.870ms
[0.260s][info ][gc,phases,start] GC(6) Phase 2: Prepare for compaction
[0.265s][info ][gc,phases ] GC(6) Phase 2: Prepare for compaction 4.449ms
[0.265s][info ][gc,phases,start] GC(6) Phase 3: Adjust pointers
[0.270s][info ][gc,phases ] GC(6) Phase 3: Adjust pointers 4.844ms
[0.270s][info ][gc,phases,start] GC(6) Phase 4: Compact heap
[0.273s][info ][gc,phases ] GC(6) Phase 4: Compact heap 2.932ms
[0.273s][info ][gc,heap ] GC(6) Eden regions: 0->0(10)
[0.273s][info ][gc,heap ] GC(6) Survivor regions: 0->0(0)
[0.273s][info ][gc,heap ] GC(6) Old regions: 20->19
[0.273s][info ][gc,heap ] GC(6) Archive regions: 0->0
[0.273s][info ][gc,heap ] GC(6) Humongous regions: 0->0
[0.273s][info ][gc,metaspace ] GC(6) Metaspace: 877K(4864K)->877K(4864K) NonClass: 791K(4352K)->791K(4352K) Class: 85K(512K)->85K(512K)
[0.273s][info ][gc ] GC(6) Pause Full (G1 Evacuation Pause) 18M->18M(20M) 33.448ms
[0.273s][info ][gc,cpu ] GC(6) User=0.03s Sys=0.00s Real=0.03s
[0.274s][info ][gc,start ] GC(7) Pause Young (Concurrent Start) (G1 Evacuation Pause)
[0.274s][info ][gc,task ] GC(7) Using 2 workers of 4 for evacuation
[0.279s][info ][gc ] GC(7) To-space exhausted
[0.279s][info ][gc,phases ] GC(7) Pre Evacuate Collection Set: 0.0ms
[0.279s][info ][gc,phases ] GC(7) Merge Heap Roots: 0.0ms
[0.279s][info ][gc,phases ] GC(7) Evacuate Collection Set: 2.6ms
[0.279s][info ][gc,phases ] GC(7) Post Evacuate Collection Set: 2.0ms
[0.279s][info ][gc,phases ] GC(7) Other: 0.1ms
[0.279s][info ][gc,heap ] GC(7) Eden regions: 1->0(10)
[0.279s][info ][gc,heap ] GC(7) Survivor regions: 0->0(0)
[0.279s][info ][gc,heap ] GC(7) Old regions: 19->20
[0.279s][info ][gc,heap ] GC(7) Archive regions: 0->0
[0.279s][info ][gc,heap ] GC(7) Humongous regions: 0->0
[0.279s][info ][gc,metaspace ] GC(7) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.279s][info ][gc ] GC(7) Pause Young (Concurrent Start) (G1 Evacuation Pause) 19M->19M(20M) 4.810ms
[0.279s][info ][gc,cpu ] GC(7) User=0.02s Sys=0.00s Real=0.01s
[0.279s][info ][gc,task ] GC(8) Using 2 workers of 4 for full compaction
[0.279s][info ][gc,start ] GC(8) Pause Full (G1 Evacuation Pause)
[0.279s][info ][gc ] GC(9) Concurrent Cycle
[0.279s][info ][gc,marking ] GC(9) Concurrent Clear Claimed Marks
[0.279s][info ][gc,marking ] GC(9) Concurrent Clear Claimed Marks 0.007ms
[0.279s][info ][gc,marking ] GC(9) Concurrent Scan Root Regions
[0.279s][info ][gc,marking ] GC(9) Concurrent Scan Root Regions 0.004ms
[0.279s][info ][gc,marking ] GC(9) Concurrent Mark (0.279s)
[0.279s][info ][gc,phases,start] GC(8) Phase 1: Mark live objects
[0.297s][info ][gc,phases ] GC(8) Phase 1: Mark live objects 17.333ms
[0.297s][info ][gc,phases,start] GC(8) Phase 2: Prepare for compaction
[0.300s][info ][gc,phases ] GC(8) Phase 2: Prepare for compaction 3.819ms
[0.300s][info ][gc,phases,start] GC(8) Phase 3: Adjust pointers
[0.306s][info ][gc,phases ] GC(8) Phase 3: Adjust pointers 5.189ms
[0.306s][info ][gc,phases,start] GC(8) Phase 4: Compact heap
[0.309s][info ][gc,phases ] GC(8) Phase 4: Compact heap 3.243ms
[0.309s][info ][gc,heap ] GC(8) Eden regions: 0->0(10)
[0.309s][info ][gc,heap ] GC(8) Survivor regions: 0->0(0)
[0.309s][info ][gc,heap ] GC(8) Old regions: 20->20
[0.309s][info ][gc,heap ] GC(8) Archive regions: 0->0
[0.309s][info ][gc,heap ] GC(8) Humongous regions: 0->0
[0.309s][info ][gc,metaspace ] GC(8) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.309s][info ][gc ] GC(8) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 29.953ms
[0.309s][info ][gc,cpu ] GC(8) User=0.02s Sys=0.00s Real=0.03s
[0.309s][info ][gc,task ] GC(10) Using 2 workers of 4 for full compaction
[0.310s][info ][gc,start ] GC(10) Pause Full (G1 Evacuation Pause)
[0.310s][info ][gc,phases,start] GC(10) Phase 1: Mark live objects
[0.327s][info ][gc,phases ] GC(10) Phase 1: Mark live objects 17.019ms
[0.327s][info ][gc,phases,start] GC(10) Phase 2: Prepare for compaction
[0.331s][info ][gc,phases ] GC(10) Phase 2: Prepare for compaction 3.941ms
[0.331s][info ][gc,phases,start] GC(10) Phase 3: Adjust pointers
[0.335s][info ][gc,phases ] GC(10) Phase 3: Adjust pointers 4.810ms
[0.335s][info ][gc,phases,start] GC(10) Phase 4: Compact heap
[0.338s][info ][gc,phases ] GC(10) Phase 4: Compact heap 2.592ms
[0.338s][info ][gc,heap ] GC(10) Eden regions: 0->0(10)
[0.338s][info ][gc,heap ] GC(10) Survivor regions: 0->0(0)
[0.338s][info ][gc,heap ] GC(10) Old regions: 20->20
[0.338s][info ][gc,heap ] GC(10) Archive regions: 0->0
[0.338s][info ][gc,heap ] GC(10) Humongous regions: 0->0
[0.338s][info ][gc,metaspace ] GC(10) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.338s][info ][gc ] GC(10) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 28.726ms
[0.339s][info ][gc,cpu ] GC(10) User=0.06s Sys=0.00s Real=0.03s
[0.339s][info ][gc,marking ] GC(9) Concurrent Mark Abort
[0.339s][info ][gc ] GC(9) Concurrent Cycle 59.644ms
[0.339s][info ][gc,start ] GC(11) Pause Young (Normal) (G1 Evacuation Pause)
[0.339s][info ][gc,task ] GC(11) Using 2 workers of 4 for evacuation
[0.339s][info ][gc,phases ] GC(11) Pre Evacuate Collection Set: 0.0ms
[0.339s][info ][gc,phases ] GC(11) Merge Heap Roots: 0.0ms
[0.339s][info ][gc,phases ] GC(11) Evacuate Collection Set: 0.0ms
[0.339s][info ][gc,phases ] GC(11) Post Evacuate Collection Set: 0.1ms
[0.339s][info ][gc,phases ] GC(11) Other: 0.1ms
[0.339s][info ][gc,heap ] GC(11) Eden regions: 0->0(10)
[0.339s][info ][gc,heap ] GC(11) Survivor regions: 0->0(0)
[0.339s][info ][gc,heap ] GC(11) Old regions: 20->20
[0.339s][info ][gc,heap ] GC(11) Archive regions: 0->0
[0.339s][info ][gc,heap ] GC(11) Humongous regions: 0->0
[0.339s][info ][gc,metaspace ] GC(11) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.339s][info ][gc ] GC(11) Pause Young (Normal) (G1 Evacuation Pause) 19M->19M(20M) 0.268ms
[0.339s][info ][gc,cpu ] GC(11) User=0.00s Sys=0.00s Real=0.00s
[0.339s][info ][gc,task ] GC(12) Using 2 workers of 4 for full compaction
[0.339s][info ][gc,start ] GC(12) Pause Full (G1 Evacuation Pause)
[0.339s][info ][gc,phases,start] GC(12) Phase 1: Mark live objects
[0.356s][info ][gc,phases ] GC(12) Phase 1: Mark live objects 16.720ms
[0.356s][info ][gc,phases,start] GC(12) Phase 2: Prepare for compaction
[0.367s][info ][gc,phases ] GC(12) Phase 2: Prepare for compaction 10.800ms
[0.367s][info ][gc,phases,start] GC(12) Phase 3: Adjust pointers
[0.372s][info ][gc,phases ] GC(12) Phase 3: Adjust pointers 5.027ms
[0.372s][info ][gc,phases,start] GC(12) Phase 4: Compact heap
[0.376s][info ][gc,phases ] GC(12) Phase 4: Compact heap 4.215ms
[0.376s][info ][gc,heap ] GC(12) Eden regions: 0->0(10)
[0.376s][info ][gc,heap ] GC(12) Survivor regions: 0->0(0)
[0.376s][info ][gc,heap ] GC(12) Old regions: 20->20
[0.376s][info ][gc,heap ] GC(12) Archive regions: 0->0
[0.376s][info ][gc,heap ] GC(12) Humongous regions: 0->0
[0.376s][info ][gc,metaspace ] GC(12) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.376s][info ][gc ] GC(12) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 37.163ms
[0.377s][info ][gc,cpu ] GC(12) User=0.09s Sys=0.00s Real=0.04s
[0.377s][info ][gc,task ] GC(13) Using 2 workers of 4 for full compaction
[0.377s][info ][gc,start ] GC(13) Pause Full (G1 Evacuation Pause)
[0.377s][info ][gc,phases,start] GC(13) Phase 1: Mark live objects
[0.394s][info ][gc,phases ] GC(13) Phase 1: Mark live objects 16.754ms
[0.394s][info ][gc,phases,start] GC(13) Phase 2: Prepare for compaction
[0.397s][info ][gc,phases ] GC(13) Phase 2: Prepare for compaction 3.615ms
[0.397s][info ][gc,phases,start] GC(13) Phase 3: Adjust pointers
[0.402s][info ][gc,phases ] GC(13) Phase 3: Adjust pointers 4.787ms
[0.402s][info ][gc,phases,start] GC(13) Phase 4: Compact heap
[0.405s][info ][gc,phases ] GC(13) Phase 4: Compact heap 2.556ms
[0.405s][info ][gc,heap ] GC(13) Eden regions: 0->0(10)
[0.405s][info ][gc,heap ] GC(13) Survivor regions: 0->0(0)
[0.405s][info ][gc,heap ] GC(13) Old regions: 20->20
[0.405s][info ][gc,heap ] GC(13) Archive regions: 0->0
[0.405s][info ][gc,heap ] GC(13) Humongous regions: 0->0
[0.405s][info ][gc,metaspace ] GC(13) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.405s][info ][gc ] GC(13) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 28.025ms
[0.405s][info ][gc,cpu ] GC(13) User=0.06s Sys=0.00s Real=0.03s
[0.405s][info ][gc,start ] GC(14) Pause Young (Concurrent Start) (G1 Evacuation Pause)
[0.406s][info ][gc,task ] GC(14) Using 2 workers of 4 for evacuation
[0.406s][info ][gc,phases ] GC(14) Pre Evacuate Collection Set: 0.0ms
[0.406s][info ][gc,phases ] GC(14) Merge Heap Roots: 0.0ms
[0.406s][info ][gc,phases ] GC(14) Evacuate Collection Set: 0.1ms
[0.406s][info ][gc,phases ] GC(14) Post Evacuate Collection Set: 0.1ms
[0.406s][info ][gc,phases ] GC(14) Other: 0.1ms
[0.406s][info ][gc,heap ] GC(14) Eden regions: 0->0(10)
[0.406s][info ][gc,heap ] GC(14) Survivor regions: 0->0(0)
[0.406s][info ][gc,heap ] GC(14) Old regions: 20->20
[0.406s][info ][gc,heap ] GC(14) Archive regions: 0->0
[0.406s][info ][gc,heap ] GC(14) Humongous regions: 0->0
[0.406s][info ][gc,metaspace ] GC(14) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.406s][info ][gc ] GC(14) Pause Young (Concurrent Start) (G1 Evacuation Pause) 19M->19M(20M) 0.332ms
[0.406s][info ][gc,cpu ] GC(14) User=0.00s Sys=0.00s Real=0.00s
[0.406s][info ][gc,task ] GC(15) Using 2 workers of 4 for full compaction
[0.406s][info ][gc ] GC(16) Concurrent Cycle
[0.406s][info ][gc,marking ] GC(16) Concurrent Clear Claimed Marks
[0.406s][info ][gc,marking ] GC(16) Concurrent Clear Claimed Marks 0.006ms
[0.406s][info ][gc,marking ] GC(16) Concurrent Scan Root Regions
[0.406s][info ][gc,marking ] GC(16) Concurrent Scan Root Regions 0.005ms
[0.406s][info ][gc,marking ] GC(16) Concurrent Mark (0.406s)
[0.406s][info ][gc,marking ] GC(16) Concurrent Mark From Roots
[0.406s][info ][gc,task ] GC(16) Using 1 workers of 1 for marking
[0.406s][info ][gc,start ] GC(15) Pause Full (G1 Evacuation Pause)
[0.406s][info ][gc,phases,start] GC(15) Phase 1: Mark live objects
[0.423s][info ][gc,phases ] GC(15) Phase 1: Mark live objects 16.596ms
[0.423s][info ][gc,phases,start] GC(15) Phase 2: Prepare for compaction
[0.427s][info ][gc,phases ] GC(15) Phase 2: Prepare for compaction 4.129ms
[0.427s][info ][gc,phases,start] GC(15) Phase 3: Adjust pointers
[0.432s][info ][gc,phases ] GC(15) Phase 3: Adjust pointers 5.072ms
[0.432s][info ][gc,phases,start] GC(15) Phase 4: Compact heap
[0.436s][info ][gc,phases ] GC(15) Phase 4: Compact heap 3.706ms
[0.436s][info ][gc,heap ] GC(15) Eden regions: 0->0(10)
[0.436s][info ][gc,heap ] GC(15) Survivor regions: 0->0(0)
[0.436s][info ][gc,heap ] GC(15) Old regions: 20->20
[0.436s][info ][gc,heap ] GC(15) Archive regions: 0->0
[0.436s][info ][gc,heap ] GC(15) Humongous regions: 0->0
[0.436s][info ][gc,metaspace ] GC(15) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.436s][info ][gc ] GC(15) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 29.957ms
[0.437s][info ][gc,cpu ] GC(15) User=0.05s Sys=0.00s Real=0.03s
[0.437s][info ][gc,task ] GC(17) Using 2 workers of 4 for full compaction
[0.437s][info ][gc,start ] GC(17) Pause Full (G1 Evacuation Pause)
[0.437s][info ][gc,phases,start] GC(17) Phase 1: Mark live objects
[0.456s][info ][gc,phases ] GC(17) Phase 1: Mark live objects 19.597ms
[0.456s][info ][gc,phases,start] GC(17) Phase 2: Prepare for compaction
[0.462s][info ][gc,phases ] GC(17) Phase 2: Prepare for compaction 5.797ms
[0.462s][info ][gc,phases,start] GC(17) Phase 3: Adjust pointers
[0.467s][info ][gc,phases ] GC(17) Phase 3: Adjust pointers 4.970ms
[0.467s][info ][gc,phases,start] GC(17) Phase 4: Compact heap
[0.470s][info ][gc,phases ] GC(17) Phase 4: Compact heap 3.354ms
[0.471s][info ][gc,heap ] GC(17) Eden regions: 0->0(10)
[0.471s][info ][gc,heap ] GC(17) Survivor regions: 0->0(0)
[0.471s][info ][gc,heap ] GC(17) Old regions: 20->20
[0.471s][info ][gc,heap ] GC(17) Archive regions: 0->0
[0.471s][info ][gc,heap ] GC(17) Humongous regions: 0->0
[0.471s][info ][gc,metaspace ] GC(17) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.471s][info ][gc ] GC(17) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 34.180ms
[0.471s][info ][gc,cpu ] GC(17) User=0.06s Sys=0.00s Real=0.03s
[0.471s][info ][gc,marking ] GC(16) Concurrent Mark From Roots 65.292ms
[0.471s][info ][gc,marking ] GC(16) Concurrent Mark Abort
[0.471s][info ][gc ] GC(16) Concurrent Cycle 65.353ms
[0.471s][info ][gc,start ] GC(18) Pause Young (Normal) (G1 Evacuation Pause)
[0.471s][info ][gc,task ] GC(18) Using 2 workers of 4 for evacuation
[0.471s][info ][gc,phases ] GC(18) Pre Evacuate Collection Set: 0.0ms
[0.471s][info ][gc,phases ] GC(18) Merge Heap Roots: 0.0ms
[0.471s][info ][gc,phases ] GC(18) Evacuate Collection Set: 0.0ms
[0.471s][info ][gc,phases ] GC(18) Post Evacuate Collection Set: 0.1ms
[0.471s][info ][gc,phases ] GC(18) Other: 0.1ms
[0.471s][info ][gc,heap ] GC(18) Eden regions: 0->0(10)
[0.472s][info ][gc,heap ] GC(18) Survivor regions: 0->0(0)
[0.472s][info ][gc,heap ] GC(18) Old regions: 20->20
[0.472s][info ][gc,heap ] GC(18) Archive regions: 0->0
[0.472s][info ][gc,heap ] GC(18) Humongous regions: 0->0
[0.472s][info ][gc,metaspace ] GC(18) Metaspace: 899K(4864K)->899K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.472s][info ][gc ] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 19M->19M(20M) 0.265ms
[0.472s][info ][gc,cpu ] GC(18) User=0.00s Sys=0.00s Real=0.00s
[0.472s][info ][gc,task ] GC(19) Using 2 workers of 4 for full compaction
[0.472s][info ][gc,start ] GC(19) Pause Full (G1 Evacuation Pause)
[0.472s][info ][gc,phases,start] GC(19) Phase 1: Mark live objects
[0.472s][info ][gc,phases ] GC(19) Phase 1: Mark live objects 0.749ms
[0.472s][info ][gc,phases,start] GC(19) Phase 2: Prepare for compaction
[0.473s][info ][gc,phases ] GC(19) Phase 2: Prepare for compaction 0.233ms
[0.473s][info ][gc,phases,start] GC(19) Phase 3: Adjust pointers
[0.473s][info ][gc,phases ] GC(19) Phase 3: Adjust pointers 0.566ms
[0.473s][info ][gc,phases,start] GC(19) Phase 4: Compact heap
[0.473s][info ][gc,phases ] GC(19) Phase 4: Compact heap 0.244ms
[0.474s][info ][gc,heap ] GC(19) Eden regions: 0->0(10)
[0.474s][info ][gc,heap ] GC(19) Survivor regions: 0->0(0)
[0.474s][info ][gc,heap ] GC(19) Old regions: 20->2
[0.474s][info ][gc,heap ] GC(19) Archive regions: 0->0
[0.474s][info ][gc,heap ] GC(19) Humongous regions: 0->0
[0.474s][info ][gc,metaspace ] GC(19) Metaspace: 899K(4864K)->899K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
[0.474s][info ][gc ] GC(19) Pause Full (G1 Evacuation Pause) 19M->0M(20M) 2.030ms
[0.474s][info ][gc,cpu ] GC(19) User=0.00s Sys=0.00s Real=0.00s
[0.475s][info ][gc,heap,exit ] Heap
[0.475s][info ][gc,heap,exit ] garbage-first heap total 20480K, used 938K [0x00000000fec00000, 0x0000000100000000)
[0.475s][info ][gc,heap,exit ] region size 1024K, 1 young (1024K), 0 survivors (0K)
[0.475s][info ][gc,heap,exit ] Metaspace used 935K, capacity 4537K, committed 4864K, reserved 1056768K
[0.475s][info ][gc,heap,exit ] class space used 92K, capacity 404K, committed 512K, reserved 1048576K
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at eternal.fire.Main.main(Main.java:10)
Process finished with exit code 1
关键提示
- java.lang.OutOfMemoryError: Java heap space
Debug
先看内存中的对象是否有必要存在
有必要存在就不是内存泄漏
- 调参:看看物理内存能不能加
- 看看对象的生命周期是不是太长
没必要存在就是内存泄漏
- 是不是垃圾收集器出了问题
虚拟机栈和本地方法栈溢出
StackOverFlowError
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package eternal.fire;
public class JVMStackOverFlow {
private int stackLength;
public void stackLeak() {
stackLength++;
stackLeak();;
}
public static void main(String[] args) {
JVMStackOverFlow jvmStackOverFlow = new JVMStackOverFlow();
try {
jvmStackOverFlow.stackLeak();
} catch (StackOverflowError e) {
System.out.println("stack length:" + jvmStackOverFlow.stackLength);
throw e;
}
}
}输出:
stack length:19056
Exception in thread "main" java.lang.StackOverflowError
- 单线程内存不够分只会触发Stack OverflowError
OutOfMemoryError
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22package eternal.fire;
public class JVMOutOfMemory {
private void dontStop() {
while (true) {
}
}
public void stackLeakByThread() {
while (true) {
Thread thread = new Thread(this::dontStop);
thread.start();
}
}
public static void main(String[] args) {
JVMOutOfMemory jvmOutOfMemory = new JVMOutOfMemory();
jvmOutOfMemory.stackLeakByThread();
}
}多线程可能触发OutOfMemoryError
比如windows 32位,每个进程的最大内存是2GB,除去java堆、方法区之类的空间,剩下的由虚拟机栈和本地方法栈瓜分,给每个线程分的栈越大,能建立线程的数量就越小,建立线程需要耗费内存,所以更容易OutOfMemoryError
可以说是创建线程导致的
一般人肯定想不到,我分给她的内存越多,她反倒越容易OutOfMemory。OutOfMemory之后可以先考虑减少线程数,如果线程数不能减少,那就换64位机器,如果换不了,那就减少Java堆和方法区的内存。啥?内存不够我还要减少java堆的内存?这一般人肯定想不到啊。
说明
按理说我的这个测试应该会OutOfMemory的,但是跑了半天却跑不出个bug来,只是我的电脑变得很卡,变得很卡是有道理的,但为啥跑不出bug呀,我猜可能是idea或者是java8以后对这个有所优化,ByTheWay,我的输入法突然崩了,但能打字,不只是搜狗输入法,我的日语输入法也出了毛病,kind of weird. 刚切到桌面,我的桌面图标的名字也变成马赛克了???神奇。我的整个系统都出了毛病。希望重启能解决问题
运行时常量池溢出
1 | package eternal.fire; |
无限intern就是很好的方法
为了防止GC回收,可以用一个List去持续持有这些String的引用
运行结果
理论结果应该是:OutOfMemoryError:PermGen space,意思是方法区空间不够了,从中也可以看出运行时常量池是方法区的一部分
- 我不敢继续运行了,我害怕对我的机器造成一些损害。
- 按理说方法区应该大小有限制的啊,怎么内存一直暴涨啊
方法区溢出
方法区存放类的信息
- 类名
- 访问修饰符
- 常量池
- 字段描述
- 方法描述
造bug方法:产生大量的类,但是比较麻烦,所以就不做了。
直接内存 溢出
1 | package eternal.fire; |
说明
- 这代码可能太老了,我编译都通过不了
