JVM入门
jvm体系结构

类加载器(双亲委派机制)
加载过程
- 类加载器接受类加载的请求
- 请求被向上委托给父类加载器,一直向上委托,直到启动类加载器
- 启动加载器检查是否能够加载当前这个类,能加载就结束
- 不能加载就通知子类加载器,直到能加载
应用程序加载器->扩展类加载器-> 启动类加载器->虚拟机自带加载器
优势
- 保证安全性
- 保证唯一性
Native(本地方法区)
凡是带native关键字的方法,说明java的作用范围到不了,会去调用c的
过程
- 会进入本地方法栈
- 调用本地方法接口 JNI
- JNI:扩展Java的使用,融合其他语言(C、C++)
栈(先进后出,后进先出)
程序运行时调用方法的栈,方法执行完就弹出
| |
| c() |
| b() |
| a() |
| main () |
|——————————-|
堆
Heap,一个JVM只有一个堆内存, 堆内存大小可以调节。
类加载器读取了文件后,一般会把类,方法,变量,常量以及所有引用类型的真实对象存放在堆中,而栈中只会存放引用类型的地址。
新生区(伊甸园区、辛存区0区(from)、辛存区1区(to))
- 所有对象都在新生区new出来的
- 类诞生、成长的地方,也可能死亡
养老区
经过新生区没有被干掉的会进入养老区
永久区(JDK1.8之后改为 元空间)
这个区域常驻内存,用来存放JDK自身携带的Class对象,interface元数据。该区域不存在垃圾回收,关闭虚拟机才会释放这个区域的内存!
JDK 1.6:永久代,常量池在方法区
JDK 1.7:永久代,慢慢退化,提出去永久代,常量池在堆中
JDK 1.8:无永久代,常量池在元空间中
OOM解决思路
- 检查代码(可借助Jpofilter工具)
- 增加内存
GC:垃圾回收(最主要在堆中)
GC垃圾回收,主要在伊甸园区和养老区(OOM堆内存不够)
GC之复制算法(最佳使用场景:对象存活率低(新生区))
每次GC后,伊甸园中未被干掉的对象将被移到辛存区中,辛存区中的一个会将对象复制到另一个辛存区中,总会保持一个空区,这个空区就是to区。
经历十五次(默认,可设置)GC后,还未被干掉的对象将被移至老年区
好处
没有内存碎片
坏处
浪费了内存空间
标记压缩清除算法(老年代,清除几次再压缩)
标记:扫描区域中的对象,将活着的对象打上标记
清除:然后清除掉未被标记(死掉)的对象
压缩:将活着的对象压缩到一边
好处
空间利用率高
坏处
浪费了时间
算法比较
内存效率:复制算法>标记清除算法>标记清除压缩算法
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
1338

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



