必懂篇JVM的认识

必懂篇JVM的认识

     首先大家要知道JVM的位置是在哪,JVM是在java操作之上的
     我们使用的JVM一般都是SUN公司的HotSpot 

JVM的原型

从编译到字节码文件再到JVM的类的加载在这里插入图片描述解析JVM
要知道 JVM中包含 栈,本地栈,堆,方法区,程序计数器

1,栈:栈主管程序的运行,生命周期和线程同步,线程结束,栈内存也就释放了,对于栈来说,不存在垃圾回收问题,一旦线程结束栈就Over

2, 本地栈:说到本地栈到大家就要知道Native,但凡方法包含Native的说明该方法是Java达不到的范围,所以会去本地方法库找,本地方法栈是要为虚拟机执行的java本地方法

3,堆: 堆是JVM最重要的一块也是面试官经常问的地方,堆是主要内存区域,推一般存放,对象实例和数组都是在推分配的,是GC主要进行回收的区域

4,方法区(永久代):方法区在JVM中是一个非常重要的区域,它与推一样都是被线程共享的区域,方法区主要存储了,类的信息,静态变量,常量,运行时的常量池也在方法区中,但是实例变量存在堆中与方法区无关

5,程序计数器: 程序计数器是线程私有的,记录执行的行号

堆内存的详细解析
在这里插入图片描述
堆中还分为新生代和老年代,永久代
首先来说说新生代吧,新生代也可以说是一个类诞生成长和消亡的地方,新生代在有分为三个区域,Eden,from,to
Eden:所有对象都是在Eden中new出来的,为什么说新生代是诞生和消亡的地方了,那是因为当Eden区内存满了就会触发GC垃圾回收
没有活下来的就会被清理,什么是没有活下来的,就是没有被引用了,那活下来的会怎么样了,活下来的就会去from和to,每次Eden区满了
活下来的就会来到from和to,首先会到from区要是from区满了就会去to区要是两个都满了就会进行GC垃圾回收清理了,要是还活下来的就会去养老区要是养老区也满了就会使用Full GC清理一次,要是Full GC清理了还是无法保存的话,那推内存满了,然后就会报出一个
java.lang.OutOfMemoryError: Java heap space异常,也是我们常说的OOM,说明Java虚拟机的堆内存不够。

现在大家知道新生代和老年代是干嘛的吧
新生代:诞生和所有对象生死存亡的地方
老年代:存储从新生代筛选出来的频繁活跃的对象

永久代
这个区域是常驻内存的,用来存放JDK自身携带的class对象,interface元数据,存储的是java自身的运行时的一些环境或者类信息,这个区域是不会进行GC回收的,他是根据JVM的关闭而释放的内存的。

在JDK1.6永久代还叫永久代,
到了JDK1.7,永久代还叫永久代,但是提出了一个概念叫去永久代
在JDK1.7之前永久代是有个问题,随着动态类的加载情况越来越多,很容易因为大小限制导致内存溢出OOM的错误
到了JDK1.8 永久代被移除了然后就是元空间的诞生
JDK8 最大的变化就是对 JVM 内存空间进行了改造,主要的区别是将方法区进行了移除,并新增了元空间,元空间是放置在 JVM 内存空间之外的直接内存中,并且 JDK8 中对于方法区的参数 PermSize 和 MaxPermSize 已经失效。

GC的认识
GC分为两种,轻GC(普通GC)和重GC(全局GC)
轻GC:一般都是在Eden区满了的情况触发和from和to中使用
重GC:一般实在养老区满了的情况触发
JVM在进行GC时,并不是对这三个区域统一回收,大部分都是在新生代中回收

**GC中有那些算法 **
额~有 标记算法,标记压缩算法,复制算法,引用算法等等

引用算法
在这里插入图片描述
引用算法是在对象的使用中通过计数器记住每个对象的使用次数来实现垃圾清除,也就是说对象为零都就会被清除
但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收,并且对计数器本身也是一种消耗,其实在JVM中根本就不会使用这种方式。

复制算法
首先大家要知道 在新生代中,from和to是互相转换的,from把对象转给to,to在转给from,他们每次转换位置也会换,直到满了才会存储到养老区

对于复制算法大家只要记住一句话:谁空谁是to
在这里插入图片描述
相信大家看图应该能看懂吧,复制算法是将数据轮换传输的直到满了就会进入养老区
好处:没有内存碎片
坏处:浪费了内存空间,多了一半空间永远都是空to,假设对象存活率是100%了(这是一种极端情况)
复制算法的应用场景:一般都是在存活率较低的情况下使用,新生代

标记算法
标记算法,也可以叫标记清除,估计大家听名字就知道,对算法的了解了
在这里插入图片描述
优点:不需要额外的空间
缺点:两次扫描,严重浪费时间,会有碎片痕迹

标记压缩算法
标记压缩算法其实可以说是对标记算法的缺点改动或者说升级
在这里插入图片描述
优点:没有碎片痕迹
缺点:多了一次扫描,多了一次移动成本

一般在JVM中 年轻代:存活率低,使用的是复制算法,老年代一般使用的是标记清楚+标记压缩算法

算法总结
内存的效率:复制算法>标记清除算法>标记压缩算法
内存整齐度:复制算法>标记压缩算法>标记清除算法
内存利用率:标记压缩算法>标记清除算法>复制算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值