JVM入门

JVM入门

jvm体系结构

jvm体系结构

类加载器(双亲委派机制)

加载过程

  1. 类加载器接受类加载的请求
  2. 请求被向上委托给父类加载器,一直向上委托,直到启动类加载器
  3. 启动加载器检查是否能够加载当前这个类,能加载就结束
  4. 不能加载就通知子类加载器,直到能加载

应用程序加载器->扩展类加载器-> 启动类加载器->虚拟机自带加载器

优势

  1. 保证安全性
  2. 保证唯一性

Native(本地方法区)

凡是带native关键字的方法,说明java的作用范围到不了,会去调用c的

过程

  1. 会进入本地方法栈
  2. 调用本地方法接口 JNI
  3. 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解决思路

  1. 检查代码(可借助Jpofilter工具)
  2. 增加内存

GC:垃圾回收(最主要在堆中)

GC垃圾回收,主要在伊甸园区和养老区(OOM堆内存不够)

GC之复制算法(最佳使用场景:对象存活率低(新生区))

每次GC后,伊甸园中未被干掉的对象将被移到辛存区中,辛存区中的一个会将对象复制到另一个辛存区中,总会保持一个空区,这个空区就是to区。

经历十五次(默认,可设置)GC后,还未被干掉的对象将被移至老年区

好处

没有内存碎片

坏处

浪费了内存空间

标记压缩清除算法(老年代,清除几次再压缩)

标记:扫描区域中的对象,将活着的对象打上标记

清除:然后清除掉未被标记(死掉)的对象

压缩:将活着的对象压缩到一边

好处

空间利用率高

坏处

浪费了时间

算法比较

内存效率:复制算法>标记清除算法>标记清除压缩算法

内存整齐度:复制算法=标记压缩算法>标记清除算法

内存利用率:标记压缩算法=标记清除算法>复制算法

狂神说JVM1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值