天天看点

Java的一些概念

最近抽空看了一些简单的概念

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.标记整理算法,与第二个区别在于回收未被引用的对象时候,会将后面的对象进行移动

清除和压缩的动作就是整理