最近抽空看了一些简单的概念
1.OpenJDK
是一个开源项目,
内容主要是定义了Java平台的Java规范,JSR,JEP.
同时提供了Java SE的所有类的源代码实现,例如java.lang,java.util,java.time等
它还提供了jvm概念的部分实现HotSpot
拥有者:OpenJDK做为GPL许可(GPL-licensed)的Java平台的开源化实现,Sun正式发布它已经六年有余
2.HotSpot
解决的问题或者设计初衷:
在嵌入式等环境中,因为内存和cpu基本上无法完成繁琐复杂的编译过程
所以需要将源代码编译成指定环境的机器码。
Java提供了一个思路,就是字节码。
字节码是优化好的能够在低性能嵌入式跑的统一的高级机器码
但是它毕竟不是机器码,如何让机器或者cpu可以识别,运行
就需要转换,JVM就是做这个的。
但是将指令翻译称主机CPU可以实际执行的指令集也是一个耗时的过程,
就可以将字节码进一步编译和缓存,比在解释器中运行更加快,这就是JIT(即时编译)
HotSpot就是即时编译的一种实现;肯定有别的实现,比如OpenJ9
3.HotSpot的基本概念和内容
3-1结构
1、类文件
class文件
2、Class Loader SubSystem(类加载子系统),加载1,由1单向进入2
这个在Spring或者jdk的resources中也有类似的概念,实现肯定不一样,面向的对象不同,思路是可以借鉴的
3.Runtime Data Area(运行时数据区域)与2进行交互,有来有往
包括几个模块:Method Area,Heap ,Java Thread, Program Counter Register,Native Internal Threads
4.Execution Engine(执行引擎),与3进行交互,有来有往
包括几个模块:JIT Compiler , Garbage Collector
5.Native Method Interface ----- Native Method Libraries(本地方法接口和库)
与Runtime Data Area有交互,与Execution Engine也有交互
3-2解释部分结构
3-2-1 Heap,也就是堆
heap分为三代,进行分代管理
Young Generation , Old Generation ,Permanent Generation
按照创建对象的时间,先出现在Young Generation;
如果经过15次垃圾回收,它还在Young Generation,就会晋升为Old Generation;
只有不受垃圾回收控制的部分,比如本地接口调用的数据一般放在Permanent Generation;
注:Young Generation细分了三个区域:Eden,S0,S1
3-3 内存回收,TLAB
每个对象创建的时候,都会在内存中申请空间;必须对内存管理
Oracle基于提高分配效率,提出一种机制,叫TLAB
Thread Local Allocation Buffers
它会对Eden区域进行划分,与线程数量一致的子区域,每个区域分配到一个线程里
每个线程在自己的区域内管理内存,除了线程之外的内存空间在何用处?
就是为了在线程使用完当前内存区域,就可以在这一块连续的内存区域进行重新申请新的内存
这样的话,这个线程就会关联两个TLAB,它就会有很多Buffers,使用线程的Free_list来管理即可
3-4 垃圾回收算法
目前接触到的一般思路就是三种:
1.复制算法
2.标记清楚算法
3.标记整理算法,也叫标记清除压缩算法
1.复制算法主要用于Eden,s0,s1之间
复制的基本思路就是将存活的对象从一个空间复制到另一个空间;
Oracle为了解决显而易见的50%利用率问题,就将空间分为3个块,复制时候,并不是等价复制到
另一个内存中,是把Eden和s0中存货的对象复制到s1中,如果s1装不下,就会把一些晋升到Old
这种方式就很大提高了内存利用率
效果不错,主要是很多对象存货不久,也就是一块内存回收后,本身占用量低
2.标记清除算法,也就是会有算法,对不同对象是否被引用,进行识别和定位
不是一个个遍历
将这些未被引用的清除,很自然就会产生不连贯的内存区域,这就是内存碎片
3.标记整理算法,与第二个区别在于回收未被引用的对象时候,会将后面的对象进行移动
清除和压缩的动作就是整理
这里面不会有内存碎片,但是会进行对象拷贝,可能涉及深度拷贝等等