发现自己真的好久木有写博客了呃...一直只顾着看书做笔记什么的,也该是时候练练表达能力了!废话不多说,接着上次的博客写吧,还是有关于JVM方面的东西!
Java虚拟机其实就是虚拟机的一种,看了两遍800多页的操作系统之后,我的理解是虚拟机就像是真实的机器一样为我们提供系统或者程序提供服务,它是将硬件设备以及软件资源整合起来,为系统或者程序提供直接的调用,这样在一台机器上就可以产生几个虚拟机。虚拟机对用户是透明的,至于虚拟机与操作系统具体是一个什么关系,应该比较复杂吧,虚拟机为操作系统提供了一个运行的平台,这里就此把虚拟机划分为两类:系统虚拟机和程序虚拟机。系统虚拟机就是刚才说的那种了,然而程序虚拟机就是为程序服务的了,就像java虚拟机一样,这里应该对java虚拟机有一点概念了吧,想想我们在运行java程序的时候,一个main函数开始的程序就占用一个java虚拟机,在这个程序里面所使用的所有资源都是这个虚拟机所提供的,下面先来看看JVN是怎样工作的吧!
Java虚拟机还是不能脱离操作系统工作的吧,所以JVM的工作就是从操作系统装载JVM开始的,操作系统是通过jdk中的java.exe来完成的,接着就是配置JVM的环境了,分成以下四步:
1、创建JVM装载环境和配置
2、装载JVM.dll
3、初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4、调用JNIENV实例装载并处理class类
JVM在整个jdk中处于最底层的,负责操作系统的交互,用来屏蔽操作系统环境,提供一个完整的java运行环境。
首先是将JVM装入环境,JVM提供的方式是操作系统的动态链接文件,这里就简要说一下吧,既然是装载JVM的文件,那么操作系统会在你的path下面找到你的程序的java.exe,再从里面通过各种调用寻找jvm.dll以及jvm.cfg,将其装载到操作系统,这样就可以在java中调用JVM的函数了。这些工作做完之后就开始运行java程序了,Java程序有两种方式一种是jar包,一种是class. 运行jar,Java -jar XXX.jar运行的时候,Java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用Java类 Java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用Java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用Java.c中LoadClass方法装载该类。
熟悉JVM的工作原理之后,我们再接着上篇博客的JVM中垃圾回收机制的算法说说吧:
一、按照基本回收策略划分
引用计数:这是一种比较传统古老的方法,原理是这样的,垃圾回收不就是对木有引用的对象进行占据内存空间的释放么,这里就是给每一个对象一个计数,当对象的引用增加一个时,它的计数就增加1,当删除一个引用的时候就减1,垃圾回收的时候就只会对计数为0的对象进行空间的释放,但这种方法不能处理循环引用的问题:
例如:
public void buidDog()
{
Dog newDog = new Dog();
Tail newTail = new Tail();
newDog.tail = newTail;
newTail.dog = newDog;
}
这里如果要回收newDog的话,前提是newTail被回收,然而要回收newTail的前提是newDog被回收,这样这两个对象都不能被回收了!
标记—清除(Mark-sweep):此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
复制(copying)
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
标记—整理(Mark-Compact)
此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
<!--EndFragment-->
二、按分区对待的方式划分
增量收集:即在应用进行的时候同时进行垃圾回收
分代收集:这种方法就是根据之前我在博客中的那种根据对不同对象的分代来进行垃圾回收
三、按系统线程来划分
串行收集:使用单线程来处理垃圾的回收工作
并行收集:使用多线程来处理垃圾回收工作
以上介绍了一些基本的垃圾回收的算法,将这个写出来也是给自己加深一下印象吧,这几种算法不能绝对的说那种比那种好,这个也会根据计算机发展而进行改进的,比如说串行收集就适合单处理器机器,并行收集就适合在多处理器机器上,当然抛开其他外部条件来说,并行的收集方式还是效率高一些!
关于JVM垃圾回收调优方面的内容将在下一篇博客里面接着来讨论!
<!--EndFragment-->
<!--EndFragment--><!--EndFragment-->
- 大小: 3.2 KB
- 大小: 4.6 KB
- 大小: 3.2 KB
分享到:
相关推荐
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2408349
四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数
深入理解JVM垃圾收集算法与垃圾收集器
主要给大家介绍了关于JVM垃圾回收算法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用JVM具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...
该资源通过图像及文字详细分析回答了JVM垃圾回收机制的三个重要面试问题: 1.哪些垃圾是需要回收的? 判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。 2.有哪些重要的垃圾回收算法? ...
Jvm垃圾回收机制 by linux_14胡嘉辉1.如何确定某个对象是“垃圾”? 2.典型的垃圾收集算法3.典型的垃圾收集器
jvm+ 垃圾算法+垃圾回收概述
全面概述jvm垃圾回收机制的功能、各部分组成及各部分算法实现
jvm 垃圾回收思维导图,总结了现有的垃圾回收器的有点以及使用场景、垃圾回收算法以及回收的判断依据。
jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。
我们知道目前的JVM的垃圾回收器都是采用 可达性分析算法 标记存活对象,该算法首先需要找到GC Roots,然后通过这些根节点向下搜索,能搜索到的就标记为存活对象,未被标记的最后就会被垃圾回收器回收。那你是否想...
主要介绍了JVM的垃圾回收算如何判断对象是否可以被回收,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
HotSpot的垃圾回收机制采用分代回收,堆分为年轻代和老年代,非堆就是持久带。面对不同的代,采用不同的回收策略。 而年轻代又可以分为1个Eden和2个Survivor。对于Eden,大多数对象都是先在此区域开辟空间,存储年轻...
JVM参数调优、垃圾回收算法及原理体系.docx
JVM:组成部分、垃圾回收机制和算法、对内存的管理办法。
JVM的内容分享,包含JVM的优化目标、优化原则、JVM组成、内存区域划分、垃圾回收算法、垃圾回收器、FullGC触发时机、对象布局、元空间存储、GC调优
JVM垃圾回收机制(GC) 引入:我们都知道,栈内存中方法运行完毕后会有弹栈的操作,不会产生垃圾,而堆内存中却没有这种操作,当堆内存中很多无用的成员变量、对象等等积压到一定程度时,就会发生堆内存溢出的一个错误...
主要介绍了图解JVM垃圾内存回收算法,由于年轻代堆空间的垃圾回收会很频繁,因此其垃圾回收算法会更加重视回收效率,下面小编就和大家来一起学习一下吧
资源描述: 1.JVM中[垃圾回收相关算法]的所有内容-pdf 2.资源内容:JVM中[垃圾回收相关算法]所有内容 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开