网站首页 网站导航 课程中心
新闻中心
您所在的位置:Java培训 > 新闻中心 > 【Java培训】java虚拟机

【Java培训】java虚拟机

来源:中软卓越 日期:2018-05-03 13:45 人气:
标签:
中软国际教育集团Python+大数据课程入驻大武汉啦!!!
1.java体系结构
 
(1) java结构包括四个部分:java虚拟机、java api、java class文件和java程序设计语言。其中,java虚拟机和java api又称java平台。
 
(2) java虚拟机:主要任务就是装载class文件,并执行。执行class的执行引擎,根据不同厂商有不同的实现,大致分为三种,第一种是一次性解释字节码,第二种是即时编译型,第三种是自适应优化器,一次解释型不利于重用,即时编译型先将字节码编译为本地机器代码,并缓存当方法以后调用的时候会直接调用,但是很耗内存,而自使用方式是将最常用的方法缓存,其他代码则利用第一种方式。
 
支持平台无关性:java应用程序是通过调用java api来调用系统资源的,而每个操作系统上的虚拟机都必须实现这些api,这些实现是平台相关的,但是程序调用的api确实相同的,因此也就保证了应用程序的平台无关性。
 
支持安全性:
 
支持网络移动性:
 
Java虚拟机的体系结构包括类加载器、方法区、堆、java栈、pc寄存器、本地方法栈和执行引擎。其中,方法区和堆都是所有线程共享的,java栈和寄存器是线程单独享有的。方法区中主要存储类型信息,常量池;堆中主要存放对象;栈中主要用来存放调用的方法的局部变量,形参,返回值以及中间结果等,java栈的单位是栈帧,每个栈帧代表一个方法。
 
(3) 类装载器:类装载器分为两种,一种是启动类装载器,一种是用户定义的类装载器,启动类装载器是jvm的一部分。
 
支持安全性:每个类装载器都有自己的命名空间,不能相互访问,当加载一个字节码时,发现需要其他的类,则动态扩展她,即用当前的类装载器装载这个类,而一个类装载器装载一个类得过程是:利用双亲委派的模式,先让父装载器转载,再返给自己,从而保证安全性。即:装载-把二进制形式的java类型读入到java虚拟机中、连接(验证-验证类型是否正确、准备-准备内存、解析-将常量池中的符号引用转化为实际引用,这一步可以到初始化之后再进行)-把已经装载到虚拟机的二进制形式的类型合并到虚拟机的运行时状态中去、初始化-给类变量赋予程序中的初始值。初始化的时机:首次主动使用时初始化(创建了类得实例,使用了某个类得静态方法或字段,初始化子类的时候)。
 
支持网络移动性:在类装载的过程中,允许动态扩展类,这就为加载网络上的class成为可能。
 
(4) class文件:
 
支持平台无关性:java致力于产生一种独立于底层的二进制代码,因此这种class文件可运行于任何有java虚拟机、硬件和操作系统的平台之上。
 
支持网络移动性:首先,class文件设计的非常紧凑,可以快速在网络上传输,其次,java程序是动态连接和动态加载的,因此可以从网络上获取class文件。
 
(5) java api:
 
支持平台无关性:java api本身是平台相关的,但是每个安装了java虚拟机的机器上都实现了java api,在不同平台上的api接口是一样的,这就使应用程序支持平台无关性成为可能。
 
支持安全性:java api在进行相对比较危险的操作的时候,有一个访问控制器来对其进行检验,若未经允许,是不允许这种操作的。
 
(6) java程序设计语言
 
支持平台无关性:java程序设计语言中的一些类型在任何系统的字节长度都是一样的
 
支持安全性:java语言中不允许使用指针,其访问内存都是结构化的,不能通过指针地址的变化来引用不同的对象;java语言支持垃圾收集,不需要程序员自己释放内存,减少了内存泄露的可能。
 
(7) java的缺陷:速度相对于其他的语言要慢,主要是把垃圾收集的任务让jvm来做了,而改善这一缺点可以从多方面努力。在算法上,在数据库的sql优化上等。也可根据你的开发目的选择垃圾收集的算法。
 
(8) 保证java安全性的组件主要是沙箱,沙箱的组成部分如下:
 
类加载器,class文件检验器(会进行四趟检验),内置于java虚拟机的安全特性(1.结构化内存的访问,2.自动垃圾收集,3.数组边界检查),安全管理器及java api
 
(9)网络移动性:把一个大的class文件,分割成小的文件,而且这些文件可以按需动态扩展。
 
(10) 方法区:
 
方法区存放的类型信息有:该类的权限定名,该类的直接超类得权限定名,该类是接口还是类,这个类型的访问修饰符,该类型的常量池,字段信息,方法信息,类变量,classloader的引用,class类得引用。
 
常量池:存储的是该类型的所有常量,包括直接常量(eg:integer I = 1)和对其他类型的符号引用。这里的常量不是编译时常量,而是运行时常量。
 
Class的引用:可以利用Class.forname或者对象.getclass()来获取类型的引用,class类中还有一些方法,getName(),getSuperClass(),getClassLoader()等。
 
(11) 堆:堆中存放的是对象的数据和指向此对象对应的类型信息,可能还有一个方发表。方发表是存储在方法区中的,如果有方法表的话,堆中的对象有一个引用,指向一个方法区中的特定结构,这个结构包括指向类型信息的引用和指向每个方法的指针。堆中也存储数组的数据和其对类型信息的引用。
 
2.java垃圾收集
 
(1) 当一个对象不再被引用指向时,就有可能被收集,在收集之前会调用这个对象的finalizer方法,在这个方法中可以复活某个对象或者自己,当把自己复活后,当再次收集这个对象的时候,就不再执行finalizer方法了。垃圾收集的目的在于收集不再被引用的对象和使堆空间变得紧凑。区分垃圾对象和活动对象的方法一般为引用计数和跟踪。
 
(2) 引用计数算法:每个对象维护一个变量,这个变量用来存放当前对象的被引用的次数。此算法的优点是:可以很快的执行,交织到程序的运行中,这种算法对于程序不能被长时间打扰的实时情况比较实用。缺点在于不能检测出循环引用,即使他们无法被触及,也永远不会被收集。
 
(3) 跟踪收集算法:追踪从根节点开始对象引用图,被引用的打上标记,当遍历结束后,未打标记的全部都可以回收。
 
(4) 压缩收集算法:将对象移动到堆空间的一边,被移动对象的引用也随之被更新。还有一种改进的方法:引用不直接引用堆上的对象,而是引用一个间接地址,当对象被移动时,只需改变间接地址即可。
 
(5) 拷贝收集算法:将空间分为两个部分,一部分始终为空,另一部分装对象,将装对象的那部分拷贝到新区域,使之没有空隙。这种算法有两个缺点,首先要停止程序运行,有时候的等到时间使得用户无法忍受。其次,只能利用一半的堆空间。
 
(6) 为了让垃圾收集的时间不至于过长,发明了火车算法:将堆空间分成一个个火车,每个火车中的每个车厢装一个对象。每个火车和车厢依次排序。当执行垃圾收集的时候,每次只收集一个火车的空间,如果当前火车中的每个对象都没有被引用,则将整个火车的对象空间全部收集,如果有对象仍然被引用,则将这个对象移动到引用对象的火车中,如果那个火车已满,则放到一个新火车中。

中软卓越是中软国际有限公司投资的大型人才服务机构,是中软国际人才战略的核心组成部分之一,承担集团发展过程中人才储备和培养的任务,是软件及外包业务快速发展的重要人才支撑平台,是集团保持高速增长动力之一。

中软国际教育集团专注IT教育36年,一直秉承“用良心做教育”的理念,是中国移动互联网研发人才一体化服务的开拓者,全力打造移动互联网研发人才服务优质平台。

公司总部位于武汉,目前已在深圳、上海、郑州、广州、大连、武汉、成都、西安、杭州、重庆、长沙、合肥、无锡、南宁、厦门、南京、南昌等全国22个省成立了60多家分公司。拥有全国的移动互联网教学就业保障团队,做到了毕业学员业内高薪水,成为学员信赖的IT培训机构。

营业执照 版权所有©Copyright 2008-2017,武汉中软卓越科技有限公司 , All Rights Reserved. ICP备案号:15018648号-1

sitemap | 来校路线 | 分类导航 | 关于我们