异常:Java中异常机制用于捕获例外事件,加强系统的容错能力java
Java具备平台无关性,对每种数据类型都分配了固定长度的空间,可是C++不一样,在不一样的平台上会分配不一样的字节数linux
http://www.javashuo.com/article/p-nhfhibef-cq.html程序员
类加载将Java字节码载入到运行时数据区,执行引擎负责Java字节码执行;算法
Java提供了动态加载的特性,只有在运行时第一次遇到类时才会去加载和连接,而非在编译时加载它。JVM的类加载器负责类的动态加载过程。Java类加载器的特色以下:编程
层次结构:Java的类加载器按是父子关系的层次结构组织的。Boostrap类加载器处于层次结构的顶层,是全部类加载器的父类。segmentfault
不能卸载: 类加载器能够载入类却不能卸载它。可是能够经过删除类加载器的方式卸载类。windows
每一个类加载器都有本身的空间,用于存储其加载的类信息。当类加载器须要加载一个类时,它经过FQCN)(Fully Quanlified Class Name: 全限定类名)的方式先在本身的存储空间中检测此类是否已存在。在JVM中,即使具备相同FQCN的类,若是出如今了两个不一样的类加载器空间中,它们也会被认为是不一样的。存在于不一样的空间意味着类是由不一样的加载器加载的。
api
当JVM请示类加载器加载一个类时,加载器老是按照从类加载器缓存、父类加载器以及本身加载器的顺序查找和加载类。也就是说加载器会先从缓存中判断此类是否已存在,若是不存在就请示父类加载器判断是否存在,若是直到Bootstrap类加载器都不存在该类,那么当前类加载器就会从文件系统中找到类文件进行加载。数组
像Web应用服务器(WAS: Web Application Server)等框架经过使用用户自定义加载器使Web应用和企业级应用能够隔离开在各自的类加载空间独自运行。也就是说能够经过类加载器的委派模式来保证应用的独立性。不一样的WAS在自定义类加载器时会有略微不一样,但都不外乎使用加载器的层次结构原理。缓存
若是一个类加载器发现了一个未加载的类,则该类的加载和连接过程以下图
每一步的具体描述以下:
运行时数据区是JVM运行时操做系统分配的内存区域,运行时数据区可分为6部分,即:为每一个线程分别建立的PC寄存器,JVM栈,本地方法栈,和被全部线程共用的数据堆,方法区,和运行时常量池。
本地方法栈:为非Java编写的本地程序定义的栈空间,也就是说它基本上是用于经过JNI(Java Native Interface)方式调用和执行的C/C++代码。根据具体状况,C栈或C++栈将会被建立。
数据堆:堆中存储着全部的类实例或对象,而且也是垃圾回收的目标场所。当涉及到JVM性能优化时,一般也会说起到数据堆空间的大小设置。JVM提供者能够决定划分堆空间或者不执行垃圾回收。
JVM经过类加载器把字节码载入运行时数据区是由执行引擎执行的。执行引擎以指令为单位读入Java字节码,就像CPU一个接一个的执行机器命令同样。每一个字节码命令包含一字节的操做码和可选的操做数。执行引擎读取一个指令并执行相应的操做数,而后去读取并执行下一条指令。
尽管如此,Java字节码仍是以一种能够理解的语言编写的,而不像那些机器直接执行的没法读懂的语言。因此JVM的执行引擎必需要把字节码转换为能被机器执行的语言指令。执行引擎有两种经常使用的方法来完成这一工做:
然而,即时编译器在编译代码时比逐一解释和执行每条指令更耗时,因此若是代码只会被执行一次,解释执行可能会具备更好的性能。因此JVM经过检查方法的执行频率,而后只对达到必定频率的方法才会作即时编译。
可达性分析:这个算法的基本思路就是经过一系列的称为“GC Roots”的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来讲,就是从GC Roots到这个对象不可达)时,则证实此对象是不可用的。
在Java语言中,可做为GC Roots的对象包括下面几种:
step2 : normal deletion
垃圾收集器清除掉标记出来的对象区域,简单的清除带来的问题是产生大量的不连续的内存碎片,空间碎片太多可能会致使在程序运行过程当中须要分配较大对象时,没法找到足够的连续内存而提早触发一次垃圾回收
step 2 :improve -- deletion with compacting 压缩整理
因为简单的清除可能会存在碎片的问题,因此又出现了压缩清除的方法,也就是先清除须要回收的对象,而后再对内存进行压缩操做,将内存分红可用和不可用两大部分。
新生代:全部new出来的新对象都在新生代,新生代这部份内存满了以后,就会发起一次GC事件,这种发生在新生代的垃圾回收称为Minor collections,这种收集相对比较快。
永久代:The Permanent generation contains metadata required by the JVM to describe the classes and methods used in the application. The permanent generation is populated by the JVM at runtime based on classes in use by the application. In addition, Java SE library classes and methods may be stored here.
最后,咱们观察上述过程能够发现,大部分的垃圾收集过程都是在新生代进行的,直到老年代中的内存不够用了才会发起一次 major GC,会进行标记和整理压缩。
建立阶段(created)
为对象分配存储空间,开始构造对象,从父类到子类对static成员进行初始化,父类成员变量按照顺序初始化,递归调用父类的构造方法,子类成员变量按照顺序初始化,子类构造方法调用,一旦对象被建立,并有某个引用指向它,这个对象的状态就切换到了应用阶段(In Use)
对象空间的从新分配 垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象完全消失了,称之为“对象空间从新分配阶段”。