您的位置:首页 > 编程语言 > Java开发

Java虚拟机

2016-02-23 14:49 411 查看
本文是在阅读以下文章的基础上总结而来:

http://blog.csdn.net/cutesource/article/details/5904542

http://www.cnblogs.com/sunada2005/p/3577799.html

http://blog.csdn.net/ning109314/article/details/10411495

http://blog.csdn.net/zsuguangh/article/details/6429592

1. JVM基本结构

    


类装载器(ClassLoader):用来装载.class文件
执行引擎:执行字节码或本地方法
运行时数据区:包括方法区、栈、Java堆、Java栈、PC寄存器、本地方法栈
运行时数据区的结构图:

    


PC寄存器:存储每个线程下一步执行的JVM命令

JVM栈:存放当前线程的局部基本类型变量(Java中八种基本类型boolean、char、byte、short、int、long、float、double)、部分返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放指向堆的地址。每个线程创建时即创建JVM栈,它是线程私有的。

堆(Heap):存储对象实例及数组值的区域,Java中由new创建的对象的内存都属于此区域,Heap中对象的内存由GC回收。Heap是JVM中所有线程共享的,在其上进行内存分配时需要加锁操作。

方法区(Method Area):存放所加载类信息、类中静态变量、类中定义为final类型的常量、类中Field信息、类中方法信息。程序中通过类对象中getName、isInterface来获取信息时,这些数据来源于方法区,方法区是全局共享的。

运行时常量池(Runtime Constant Pool):类中固定的常量信息、方法和Field引用信息等,该空间是从方法区分配得到的。

本地方法栈(Native Method Stack):存储每个native方法的调用状态。

2. Java代码的编译和执行

Java源码通过编译器编译得到Java字节码,Java字节码经过Java虚拟执行引擎得到目标代码,具体流程图如下:

     


3. JVM垃圾回收

3.1 垃圾收集算法

引用计数法(Reference Counting Collector):唯一没有使用根集的垃圾回收的法,该算法使用引用计数器来区分存活对象和不再使用的对象。一般来说,堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。

tracing算法(Tracing Collector):为了解决引用计数法的问题而提出,它使用了根集的概念。基于tracing算法的垃圾收集器从根集开始扫描,识别出哪些对象可达,哪些对象不可达,并用某种方式标记可达对象,例如对每个可达对象设置一个或多个位。在扫描识别过程中,基于tracing算法的垃圾收集也称为标记-清除垃圾收集器。

compacting算法(Compacting Collector):又叫标记-整理算法,采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。在基于Compacting算
法的收集器的实现中,一般增加句柄和句柄表。

copying算法(Coping
Collector)
:该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于 copying算法的垃圾 收集就从根集中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对
象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。一种典型的基于coping算法的垃圾回收是stop-and-copy算法,它将堆分 成对象面和空闲区域面,在对象面与空闲区域面的切换过程中,程序暂停执行。

generation算法(Generational
Collector)
:该算法将堆分成两个或多个,每个子堆作为对象的一代
(generation)。由于多数对象存在的时间比较短,随着程序丢弃不使用的对象,垃圾收集器将从最年轻的子堆中收集这些对象。在分代式的垃圾收集器运行后,上次运行存活下来的对象移到下一最高代的子堆中,由于老一代的子堆不会经常被回收,因而节省了时间。
adaptive算法(Adaptive Collector):基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,选择适当算法的垃圾收集器。

3.2
触发GC的条件


1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用

2)Java内存不足时GC会被调用

3.3
减少GC开销的措施


1)不要显示调用system.gc()

2)尽量减少临时对象的使用

3)对象不使用时尽量显示置为NULL

4)尽量使用StringBuffer,而不用String来累加字符串

5)能用基本类型如Int、Long,而不用Integer、Long对象

6)尽量少用静态对象变量

7)分散对象创建和删除的时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm 虚拟机