java教程-虚拟机体系结构深入研究总结

java教程-虚拟机体系结构深入研究总结

ID:35294600

大小:175.84 KB

页数:4页

时间:2019-03-23

java教程-虚拟机体系结构深入研究总结_第1页
java教程-虚拟机体系结构深入研究总结_第2页
java教程-虚拟机体系结构深入研究总结_第3页
java教程-虚拟机体系结构深入研究总结_第4页
资源描述:

《java教程-虚拟机体系结构深入研究总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、http://www.moliying.com工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,内存优化和性能调优就成了我惯用的“伎俩”。要对Java程序进行内存优化和性能调优,不了解虚拟机的内部原理(或者叫规范更严谨一点)是肯定不行的,这里推荐一本好书《深入Java虚拟机(第二版)》(BillVenners著,曹晓刚蒋靖译,实际上本文正是作者阅读本书之后,对Java虚拟机的个人理解阐述)。当然了,了解Java虚拟机的好处并不仅限于上述两点好处。从更深一点的技术层面上看

2、,了解Java虚拟机的规范和实现,将更加有助于我们编写高效、稳定的Java代码。比如,假如了解Java虚拟机的内存模型,了解虚拟机的内存回收机制,那么我们就不会过分依赖它,而会在需要的时候显式的”释放内存”(Java代码不能显式释放内存,但是可以通过释放对象引用告知垃圾回收器回收该对象需要被回收),以降低不必要的内存消耗;假如我们了解Java栈的工作原理,那么我们就可以通过减少递归层数,减少循环次数来降低堆栈溢出的风险。可能对于应用开发人员来说,可能不会直接去涉及这些Java虚拟机底层实现的工作,但是了解这些背景知识,或多或少,都会对我们写的程序产生潜移默化

3、的好的影响。本篇文章,将简明扼要的说明Java虚拟机的体系结构和内存模型,如有用词不妥或解释不准确之处,请不吝指正,深感荣幸!Java虚拟机体系结构类装载子系统磨砺营IT教育版权所有http://www.moliying.comJava虚拟机有两种类装载器,分别是启动类装载器和用户自定义装载器。通类装载子系统通过类的全限定名(包名和类名,网络装载还包括URL)将Class装载进运行时数据区。对于每一个被装载的类型,Java虚拟机都会创建一个java.lang.Class类的实例来代表该类型,该实例被放在内存中的堆区,而装载的类型信息则位于方法区,这一点和所有

4、其他对象都是一样的。类装载子系统在装载一个类型前,除了要定位和导入对应的二进制class文件外,还要验证导入类的正确性,为类变量分配并初始化内存,以及解析符号引用为直接引用,这些动作严格按照以下顺序进行:1)装载——查找并装载类型的二进制数据;2)连接——执行验证,准备以及解析(可选)3)验证确保被导入类型的正确性4)准备为类变量分配内存,并将其初始化为默认值5)解析把类型中的符号引用转换为直接应用方法区对于每一个被类装载子系统装载的类型,虚拟机都会保存下列数据到方法区:·类型的全限定名·类型超类的全限定名(java.lang.Object没有超类)·类型是

5、类类型还是接口类型·类型的访问修饰符·任何直接超接口的全限定名有序列表除了上述基本类型信息,还将保存如下信息:·类型的常量池·字段信息(包括字段名、字段类型、字段修饰符)·方法信息(包括方法名、返回类型、参数的数量和类型、方法修饰符,如果方法不是抽象和本地的,还将保存方法的字节码、操作数栈和该方法栈帧中的局部变量区的大小和异常表)·常量以外的所有类变量(其实就是类的静态变量,因为静态变量是所有实例共享的,且与类型直接相关,所以他们是类一级的变量,作为类的成员被保存在方法区)一个到类ClassLoader的引用//返回的就是刚才保存的ClassLoader引用

6、   String.class.getClassLoader();一个到Class类的引用磨砺营IT教育版权所有http://www.moliying.com//将返回刚才保存的Class类的引用   String.class;注意,方法区也是可以被垃圾回收器回收的。堆Java程序在运行时创建的所有类实例或数组都放在同一个堆中,而每一个Java虚拟机也是有一个对空间,所有线程共享一个堆(这就是一个多线程的Java程序会产生对象访问的同步问题的原因了)。由于每一种Java虚拟机都有对虚拟机规范的不同实现,所以我们可能不知道每一种Java虚拟机在堆中是以何种形式

7、表示对象实例的,不过我们可以通过下面这可能的实现来一窥端倪:程序计数器对于运行中的Java程序而言,每一个线程都有自己的PC(程序计数器)寄存器,它是在该线程启动时创建的,大小为一个字长,用来保存需要被执行的下一行代码的位置。Java栈每一个线程都有一个Java栈,以栈帧为单位保存线程的运行状态。虚拟机对Java栈的操作有两种:压栈和出栈,二者都已帧为单位。栈帧保存了传入参数、局部变量、中间运算结果等数据,在方法完成时被弹出,然后释放。看一下两个局部变量相加时栈帧的内存快照磨砺营IT教育版权所有http://www.moliying.com本地方法栈这是Ja

8、va调用操作系统本地库的地方,用来实现JNI(Jav

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。