java虚拟机.docx
《java虚拟机.docx》由会员分享,可在线阅读,更多相关《java虚拟机.docx(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题;它实现了热点代码检测和运行时编译及优化,这使得java应用能随着运行时间的增加而获得更高的性能。JDK:java程序设计语言、java虚拟机、java API类库。Java API类库中的java SE API子集和java虚拟机这两部分统称为JRE。Java技术关注的重点业务领域划分:1. java Card:支持一些java小程序运行在小内存设备上的平台。2. Java ME:支持java程序运行在移动终端上的平台。3. Java SE:支持面
2、向桌面级应用的java平台。4. Java EE:支持使用多层架构的企业应用。运行时数据区:1. 程序计数器:一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。此内存区域是唯一一个在java虚拟机规范中没有规定任何outofmemoryerror情况的区域。2. Java虚拟机栈:是线程私有的。它的生命周期与线程相同。虚拟机描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应于
3、一个栈帧在虚拟机栈中从入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出stackoverflowerror异常;如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存时会抛出outofmemoryerror异常3. 本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机使用到的native方法服务。4. Java堆:java堆是被所有线程共享的一块内存区域。用来存放对象实例。是垃圾收集器管理的主要区域。现在收集器基本上都是采用的分代收集算法。5. 方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类
4、信息、常量、静态变量、即使编译器编译后的代码等数据。运行时常量池:是方法区的一部分。用于存放编译期生成的各种字面量和符号引用。如果使用直接指针访问方式,java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确的定位出泄漏代码的位置。不存在泄漏,那么应当检查虚拟机的堆参数,与机器物理内存对比看是否可以调大。为什么要了解GC和内存分配:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并
5、发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存。引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。有个例子:objA和objB都有字段instance,赋值令objA.istance=objB及objB.instance=objA。除此之外,这两个对象再无任何引用,实际上这两个对象已经不可能再被访问,但是他们因为互相引用着对方,导致它们的引用计数都不为0
6、,于是引用计数算法无法通知GC收集器回收他它们。System.gc()。虚拟机并没有因为这两个对象互相引用就不回收它们。说明虚拟机并不是通过引用计数算法判断对象是否存活。根搜索算法:通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。GC Roots的对象包括下面几种:虚拟机栈中的引用的对象;方法区中的类静态属性引用的对象;方法区中的常量引用的对象;本地方法栈中JNI的引用的对象。对象回收:首先对象在进行跟搜索后发现没有与GC Roots相连接的引用链,那它将会被第一
7、次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()的方法。当对象没有覆盖finalize()方法或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条有虚拟机自动建立的、低优先级的finalizer线程去执行。这时,在进行第二次小规模的标记,如果此时有对象重新与引用链的任何一个对象建立关联,那么就被移除出“即将回收”的集合。剩下的,就等着回收。垃圾收集算法:1. 最基础的收集算法是“标记-清除”算法:首先标记
8、出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。缺点:效率不高;会产生大量不连续的内存碎片。2. 复制算法。将内存容量划分为大小的两块。每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。3. 标记-整理算法:标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。4. 分代收集算法:根据对象的存活周期的不同将内存划分为几块。一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾
9、收集时发现大批对象死去,只有少量存活,那么选用复制算法。在老生代中,对象存活率高,没有额外的空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。23种设计模式:1. 抽象工厂模式:他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。 产品族的扩展将
10、是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。2. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。优点:可以使代码结构清晰,有效地封装变化;对调用者屏蔽具体的产品类;降低耦合度。3. 单例模式:单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对
11、话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。4. 代理模式:代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用. 代理模式涉及的角色: 1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 2:代理主题
12、角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作. 3:真实代理对象.定义了代理角色所代表的具体对象. java对代理模式的支持 -动态代理 上面的代理,我们强迫代理类RedWineProxy实现了抽象接口SellInterface.这导致我们的代理类无法通用于其他接口,所以不得不为每一个接口实现一个代理类.幸好,java为代理模式提供了支持. java主要是通过Proxy类和InvocationHan
13、dler接口来给实现对代理模式的支持的. 通过上面的代码可以看出,代理主题ProxyObject类并没有实现我们定义的SellInterface借口, 而是实现了java的InvocationHandler接口,这样就把代理主题角色和我们的业务代码分离开是实现了java的InvocationHandler接口,这样就把代理主题角色和我们的业务代码分离开来,使代理对象能通用于其他接口. 其实InvocationHandler接口就是一种拦截机制,当系统中有了代理对象以后,对原对象(真实主题)方法的调用,都会转由InvocationHandler接口来处理,并把方法信息以参数的形式传递给invok
14、e方法,这样,我们就可以在invoke方法中拦截原对象的调用,并通过反射机制来动态调用原对象的方法来,使代理对象能通用于其他接口. 5. 责任链模式:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。6. 观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更
15、新自己。观察者模式的组成:1. 抽象主题角色2. 抽象观察者角色:3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,得到主题的通知时更新自己 1.抽象主题角色类 2. 抽象观察者角色 3. 具体主题角色(Watched) 4. 具体观察者角色(Watcher) 从AWT1.1开始图形系统的事件模型采用观察者模式,因此观察者模式在Java语言中的地位极其重要。在xml解析中的SAX
16、也采用了观察者模式来实现。Java也提供了对观察者模式的内置支持7. 策略模式:策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式的好处在于你可以动态的改变对象的行为。策略模式中有三个对象:(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。(2) 抽象策略对象:它可由接口或抽象类来实现。(3) 具体策略对象:它封装了实现同不功能的不同算法。Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同
17、的元素而另一些不行。一些能排序而另一些不行。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。除了具有Collection接口必备的itera
18、tor()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现
19、访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(.); ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,
20、因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。 Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 Set是一种不包含重复的元素的Collection,即任意
21、的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。 请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 虚拟机
限制150内