JVM工作原理,层级结构及GC工作原理学习

1,JVM即Java虚拟机,实现了java语言的重要特性:与运行平台无关。JVM的原理:编译后的java指令并不能够在硬件上直接运行,而是由JVM执行。jvm屏蔽了与平台相关的信息,使java语言编译程序只需要生成可以在JVM上运行的字节码文件(.class)Java虚拟机在执行过程中,将字节码文件解释成具体平台的机器指令执行。因此,JVM是字节码文件与硬件平台的接口。

2,JVM = 类加载器(classLoader)+ 执行引擎(execution engine)+运行时数据区(runtime data area),具体过程:类加载器将硬盘上的.class文件加载到运行时数据区,负责执行的是执行引擎。

3,classloader

    作用:加载.class文件

    方式:1,隐式:运行过程中,遇到new关键字要生成对象时,隐式调用classLoader到JVM

              2,显示:通过class.forname()动态加载

    双亲委派模型(保证java平台安全)

    

双亲委派模型的工作过程为:

(1)当前 ClassLoader 首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。

每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,
等下次加载的时候就可以直接返回了。

(2)当前 classLoader 的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到 bootstrap ClassLoader.

(2.1)当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

4,执行引擎

runtime data area -- 在jvm运行期间,对内存的划分与分配。jvm在运行时将数据划分为6个区域来储存。程序员写的所有程序都被加载到运行时数据区域中,不同类别的数据存放到不同区域。(heap,java stack,native method stack,PC register,method area)

5,GC

何为GC?
垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的,GC是后台的守护进程。它的特别之处是它是一个低优先级进程,但是可以根据内存的使用情况动态的调整他的优先级。因此,它是在内存中低到一定限度时才会自动运行,从而实现对内存的回收。这就是垃圾回收的时间不确定的原因。

为何要这样设计:因为GC也是进程,也要消耗CPU等资源,如果GC执行过于频繁会对java的程序的执行产生较大的影响(java解释器本来就不快),因此JVM的设计者们选着了不定期的gc。

GC有关的是: runtime data area 中的 heap(对象实例会存储在这里) 和 gabage collector方法。
程序运行期间,所有对象实例存储在运行时数据区域的heap中,当一个对象不再被引用(使用),它就需要被收回。在GC过程中,这些不再被使用的对象从heap中收回,这样就会有空间被循环利用。
GC为内存中不再使用的对象进行回收,GC中调用回收的方法--收集器garbage collector. 由于GC要消耗一些资源和时间,Java 在对对象的生命周期特征(eden or survivor)进行分析之后,采用了分代的方式进行对象的收集,以缩短GC对应用造成的暂停。

在垃圾回收器回收内存之前,还需要一些清理工作。
因为垃圾回收gc只能回收通过new关键字申请的内存(在堆上),但是堆上的内存并不完全是通过new申请分配的。还有一些本地方法(一般是调用的C方法)。这部分“特殊的内存”如果不手动释放,就会导致内存泄露,gc是无法回收这部分内存的。
所以需要在finalize中用本地方法(native method)如free操作等,再使用gc方法。显示的GC方法是system.gc()

猜你喜欢

转载自my.oschina.net/u/2320584/blog/1784811
今日推荐