android 相关的JVM,GC 知识的扩充

1 JVM 是一种规范

java文件-》编译器-》字节码-》机器码

JAVA虚拟机与JAVA语言并没有直接联系,他只是特定的二进制文件格式.class文件有所关联, CLASS文件中包含JVM虚拟机指令集(bytecodes)和符号表,还有一些其他辅助信息。

java 编译器指令流 是基于 栈的指令集架构,而另一种指令集架构为基于寄存器的指令集架构

 2 堆的默认大小

默认空间大小:  

初始大小:物理电脑内存大小 / 64
最大内存大小:物理电脑内存大小 / 4

3 MinorGc、MajorGC、FullGC的区别

JVM在进行GC时,并非每次都对上面三个内存区域一起回收,大部分的只会针对于Eden区进行 在JVM标准中,他里面的GC按照回收区域划分为两种:

 一种是部分采集(Partial GC ): 新生代采集(Minor GC / YongGC): 只采集新生代数据

老年代采集(Major GC / Old GC): 只采集老年代数据,目前只有CMS会单独采集老年代

混合采集(Mixed GC): 采集新生代与老年代部分数据,目前只有G1使用 一种是整堆采集(Full GC): 收集整个堆与方法区的所有垃圾

GC触发策略

年轻代触发机制:

当年青代空间不足时,就会触发MinorGc,这里年轻代满值得是Eden区中满了

因为Java大部分对象都是具备朝生熄灭的特性,所以MinorGC非常频繁,一般回收速度也 快 MinorGc会出发STW行为,暂停其他用户的线程


老年代GC触发机制:

出现MajorGC经常会伴随至少一次MinorGC(非绝对,老年代空间不足时会尝试触发 MinorGC如果空间还是不足则会出发MajorGC)

MajorGC比MinorGC速度慢10倍,如果MajorGC后内存还是不足则会出现OOM

FullGC触发

调用System.gc()时

老年代空间不足时
方法区空间不足时

通过MinorGC进入老年代的平均大小大于老年代的可用内存

在Eden使用Survivor进行复制时,对象大小大于Survivor的可用内存,则该对象转入老年代,且 老年代的可用内存小于该对消

Full GC 是开发或者调优中尽量要避开的

TLAB(Thread Local Allocation Buffer )

什么是TLAB?

堆区是线程共享区,任何线程都可以访问堆中共享数据
由于对象示例的创建很频繁,在并发环境下对重划分内存空间是线程不安全的,如果需要
避免多个线程对于同一地址操作,需要加锁,而加锁则会印象分配速度

所以JVM默认在堆区中开辟了一块空间,专门服务于每一个线程。他为每个线程分配了一 个私有缓存区域,包含在Eden中,这就是TLAB

多线程同时分配内存是,使用TLAB可以避免一系列的非线程安全问题

TLAB会作为内存分配的首选,TLAB总空间只会占用EDEN空间的1%

一旦对象在TLAB空间分配失败,JVM会尝试使用加锁来保证数据操作的原子性,从而直接 在Eden中分配

逃逸分析:

使用逃逸分析,编译器可以堆代码做如下优化:
1.栈上分配:JIT编译器在编译期间根据逃逸分析计算结果,如果发现当前对 象没有发生逃逸现象,那么当前对象就可能被优化成栈上分配,会将对象直接 分配在栈中
2.标量替换:有的对象可能不需要作为一个连续的内存结构存在也能被访问到, 那么对象部分可以不存储在内存,而是存储在CPU寄存器中。

标量替换

标量:指一个无法再分解成更小的数据的数据。Java中的原始数据
类型就是标量
聚合量:Java中的聚合量指的是类,封装的行为就是聚合


标量替换:指的是,在未发生逃逸的情况下,函数内部生成的聚合量在经过 JIT优化后会将其拆解成标量。

字节码看对象内存创建过程

 

垃圾回收相关算法

1 垃圾确认算法--标记阶段算法

                引用计数算法  (无法处理循环引用的情况 )

                GCRoot可达性分析算法

2 清除垃圾算法--清楚阶段算法

                标记-清除算法

                复制算法

                标记-压缩算法

                分代收集算法

ROOT---

一个指针,他保存了堆里面的对象,但自己又不在堆当中,那么他就是一个Root

增量收集算法

        上诉所有算法,在回收过程张,软件都会处于一种STW的状态。在stw状态下,程序所有线程都会挂起,暂停一切正常工作,等待垃圾回收完成,这种情况将严重影响用户体验或系统稳定。为了解决这个问题,催生出了一套增量收集算法。

基本概念:

        如果一次性将所有垃圾进行处理,需要造成系统长时间听端,那么久可以让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。一次反复,知道垃圾收集完成。

总结:实际上就是通过对线程间冲突的妥善处理,允许垃圾收集线程以分阶段的方式完成标记、清理、复制等工作。

缺点:使用这种方式,由于在垃圾回收过程种,间断性的还执行了应用程序代码,所有能减少听屯时间。但是因为线程切换和上下文装欢的消耗,会使得垃圾回收的总体成本上升,系统吞吐量下降。

分区算法

        相同条件下,堆空间越大,一次gc时间越长,停顿时间也越长,为了更好的空间gc产生的停顿时间,将一块大的内存区域分割程多个小块,根据目标的停顿时间,每次合理的回收诺干小区间,而不是整个对空间,从而减少一次gc所产生的停顿。

总结:实际上gc过程要复杂的多,需要考虑的不单单是这些,还有并行与并发的兼顾,而且通常都会应用复合算法去使用。

垃圾回收器

 垃圾回收的并行与串行

 

 CMS回收器

 

 

Dalvik虚拟机&Hotspot区别

基于堆栈的Java指令(1个字节)和基于寄存器的Dalvik指令(2、4或者6个字节)各有优劣

一般而言,执行同样的功能, Java虚拟机需要更多的指令(主要是load和store指令),而Dalvik虚拟机需 要更多的指令空间

需要更多指令意味着要多占用CPU时间,而需要更多指令空间意味着指令缓冲(i-cache)更易失效

Dalvik虚拟机使用dex(Dalvik Executable)格式的类文件,而Java虚拟机使用class格式的类文件 一个dex文件可以包含若干个类,而一个class文件只包括一个类

由于一个dex文件可以包含若干个类,因此它可以将各个类中重复的字符串只保存一次,从而节省了空间, 适合在内存有限的移动设备使用

一般来说,包含有相同类的未压缩dex文件稍小于一个已经压缩的jar文件

ART与Dalvik

 dex2aot

Dalvik下应用在安装的过程,会执行一次优化,将dex字节码进行优化生成odex文件。而Art下将应用的dex 字节码翻译成本地机器码的最恰当AOT时机也就发生在应用安装的时候。ART 引入了 ,在安装时,ART 使用设备自带的 dex2oat 工具来编译应用,dex中的字节码将被编 译成本地机器码

 

 

垃圾回收收相回收垃圾回收相关算

2法垃ART与DalviART与Dalvi圾回收相关算法垃圾回收相关算法回收相关算法垃圾回收相关算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值