java虚拟机相关知识

JAVA程序执行过程
  1. java文件通过编码器编译成 .class文件,即字节码文件
  2. 类加载器根据字节码文件来进行加载
  3. 加载完字节码文件之后,有执行引擎进行执行,可能会使用到数据区的数据

JVM结构
如图所示,JVM主要包括两个子系统和两个组件。
两个子系统分别是 ClassLoader和ExecytionEngine, 两个组件分别是 RuntimeDateArea和NativeInterface

ClassLoader的作用:根据给定的全限定类名来装载class文件到runtime data area 和 method area
Execution engine的作用:执行classes中的指令,不用的角jdk区别就在于执行引擎的区别
Native interface组件:与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的native heap OutOfMemory
Runtime Data Area组件:
就是JVM的内存,主要分为五个部分
1.Heap(堆):一个jvm实例中只存在一个堆空间
2.MethodArea(方法区域):被装载的class信息存储在MethodArea的内存里,当虚拟机装载时,它使用类装载器定位响应的class文件,然后读入class文件内容传输到虚拟机之中
3.java stack(java的栈):jvm只会对stack进行以帧为单位的压栈和入栈
4.Program method stack (程序计数器):每一个线程都有自己的pc寄存器
5.Native method stack(本地方法栈):保存native方法进入区域的地址

垃圾回收机制

一.如何确定某个对象是“垃圾”?
1. 引用计数法
在java中使用过引用来和对象进行关联的,也就是说要操作对象,必须通过引用来进行。 所以通过引用计数来判断对象是否可以进行回收。如果一个个对象没有被任何引用,那么该对象就没有被使用即可以被回收,但是这种方法不能解决循环引用的情况。
2.可达性分析法
该方法的基本思想是通过一系列的“GC Roots” 对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

二.典型的垃圾收集算法
1.Mark-Sweep(标记-清除)算法
即分两步来进行垃圾回收,第一步对于需要回收的对象进行标记,第二步是对标记的对象进行回收
这样的处理方法比较简单但是可能会导致存留许多内存碎片
2.Copying(复制)算法
将内存可用容量分为大小相等的两部分,每次只使用其中的一块。当其中的一块内存用完了,就把其中还存活的对象复制到另一块新的内存区域上,这样既可以回收不使用的对象,又不容易出现内存碎片的现象,但是copying 的效率与需要复制的内存对象的数量有关。


猜你喜欢

转载自blog.csdn.net/sinat_29774479/article/details/79669216