JVM初识:
java只是启动JVM的命令。JVM真实位置: C:\Program Files\Java\jdk1.8.0_121\jre\bin\server\jvm.dll
1. 第一行JDK版本
2. 第二行JRE版本
3. 第三行JVM版本
1. 混合模式:速度最快(默认)
2. 解释模式:解释运行
3. 编译模式:编译优化运行
- 在HostSpot中,方法区在Perm永久代。
- Heap包括Young新生代和Tenured年老代,不包括Perm。
- 一个java线程启动一个stack,一个stack默认1024K。所以开很多线程可能会导致StackOverFlow。
- 本地方法栈通常用来调用C语言。
- 程序计数器保存的是线程执行到哪段代码的位置。
- 方法区和Heap是线程共享区域,其他块属于线程独享区域。
会OOM的区域:
- Perm会OOM
- Heap会OOM
- Stack会OOM(概率很低)和StackOverFlow
- Direct Memory会OOM
- 新生代使用的垃圾回收算法是复制算法,垃圾回收GC叫Minor GC。Eden区满了,就进行Minor GC,把存活的对象复制到Survivor1,Survivor1满之后,把垃圾又复制到Survivor2,如果Survivor都满了,就直接进入Tenured年老代。新生代和年老代垃圾回收的速度比大概是1:10. 年老代的垃圾回收叫Major GC。Full GC指的是JVM内的所有对象进行逐一排查,把垃圾删除。10g堆内存,可能需要5分钟Full GC。
- HeapDumpOnOurOfMemoryError可以dump出OOM日志,说明问题出在Heap和Perm。没有日志,说明可能在Direct Memory或Stack,不过Stack一般不OOM。
- Direct Memory直接使用操作系统物理内存。