摩根面试准备要点(Java).docx
《摩根面试准备要点(Java).docx》由会员分享,可在线阅读,更多相关《摩根面试准备要点(Java).docx(73页珍藏版)》请在三一办公上搜索。
1、摩根面试准备要点1. JVM架构(Vincent) 主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。 Class loader子系统的作用 :根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)。Javsa程序员可以extends java.lang.ClassLoader类来写自己的Cla
2、ss loader。 Execution engine子系统的作用 :执行classes中的指令。任何JVM specification实现(JDK)的核心是Execution engine, 换句话说:Sun 的JDK 和IBM的JDK好坏主要取决于他们各自实现的Execution engine的好坏。每个运行中的线程都有一个Execution engine的实例。 Native interface组件 :与native libraries交互,是其它编程语言交互的接口。 Runtime data area 组件:这个组件就是JVM中的内存。 下面对这个部分进行详细介绍。 Runtime d
3、ata area的整体架构图Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有。 Heap Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程
4、都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。 (这里可能出现的异常java.lang.OutOfMemoryError: Java heap space) Method area 在Java虚拟机中,被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。
5、该类型中的类(静态)变量同样也存储在方法区中。与Heap 一样,method area是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。 (这里可能出现的异常java.lang.OutOfMemoryError: PermGen full)Java stack Java stack以帧为单位保存线程的运行状态。虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到java sta
6、ck中(压栈);当一个方法调用返回时,从java stack弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow问题。 下面的程序可以说明这个问题。public class TestStackOverFlow public static void main(String args) Recursive r = new Recursive();r.doit(10000);/ Exception in thread main java.lang.StackOverflowErrorclass Recursive public int doit(int t) if (t
7、 = 1) return 1;return t + doit(t - 1);Program counter 每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址;,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。 Native method stack 对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它
8、想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM相同的能力和权限。 (这里出现JVM无法控制的内存溢出问题native heap OutOfMemory ) 2. CLassLoader (Vincent)Java的可执行文件不同于C/C+,Java编译器只产生中间字节码文件(.class文件),由Java虚拟机(java.exe)解释执行。Java发布的程序(JAR包)也多半是一堆class文件,运行时由ClassLoader加载到Java虚拟机中执行。ClassLoader是Java虚拟机的主要组成部分,由Java语言编写,用户可以实现自定义的Clas
9、sLoader来完成特定的功能。下面我们用例子说明ClassLoader。 JVM规范定义了两种类型的ClassLoader:Bootstrap ClassLoader和User-defined ClassLoader。 JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader。Bootstrap是用C+编写的,我们在Java中看不到它,是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。AppClassLoader的Parent是ExtClassLoade
10、r,而ExtClassLoader的Parent为Bootstrap ClassLoader。 3. java中,什么叫不可更改的类(immutable class)(Kevin Tam)从字面意思来理解就是不会发生变化的类,那么是什么不会发生变化呢,其实就是类的状态,也就是不变类的实例一旦被创建,其状态就不会发生变化,举个例子:如果人是一个class,那么我们中的每一个都是人这个类的具体的instance,如果人这个类只有一个状态就是生身父母,那么它就是一个不变类,因为每一个人在出生的那一刹那,生身父母就已经被设置了值,而且终生都不会发生变化。 不变类有什么好处呢?1) 不变类是线程安全的,
11、由于不变类的状态在创建以后不再发生变化,所以它可以在线程之间共享,而不需要同步。2) 不变类的instance可以被reuse创建类的实例需要耗费CPU的时间,当这个实例不再被引用时,将会被垃圾回收掉,这时候,又需要耗费CPU的时间。对于不变类而言,一个好处就是可以将常用的实例进行缓存,从而减少了对象的创建。举个例子,对于布尔型,最常用的便是true and false。JDK中的Boolean类就是一个不变类,并且对这两个实例进行了缓冲。public final class Boolean implements java.io.Serializable/* * The Boolean obj
12、ect corresponding to the primitive * value true. */public static final Boolean TRUE = new Boolean(true); /* * The Boolean object corresponding to the primitive * value false. */public static final Boolean FALSE = new Boolean(false);/ 这个方法不会创建新的对象,而是重用已经创建好的instance public static Boolean valueOf(bool
13、ean b) return (b ? TRUE : FALSE); 3) 不变类的某些方法可以缓存计算的结果hashCode这个方法来自于Object这个类,这个方法用来返回对象的hashCode,主要用于将对象放置到hashtable中时,来确定这个对象的存储位置。对于一个不变类的实例,它的hashCode也是不变的,所以就可以缓存这个计算的结果,来提高性能,避免不必要的运算,JDK中的String类就是一个例子。public final class String /* Cache the hash code for the string */private int hash; / Defa
14、ult to 0 public int hashCode() int h = hash;if (h = 0) / compute the value hash = h; / cache the value return h; 在JDK中, String, the primitive wrapper classes, and BigInteger and BigDecimal都是不变类。如果一个类是不变类,这个类是不是就不能有改变状态的方法呢?答案当然是否定的,String是一个不变类,仍然有replace,replaceAll这样的方法,而String仍然是一个不变类,那是因为在这些改变状态的
15、方法中,每次都是新创建一个String对象。如果大家理解了不变类,那也就不难理解为什么在做String的concatenate时,应当用StringBuffer而不是用+的操作符。如何正确使用String呢?1) 不要用new去创建String对象。如果使用new去创建String,那么每次都会创建一个新对象。public static void main(String args) String A1 = A; String A2 = A; / It wont create a new object checkInstance(A1, A2); / Result: They are same
16、instances String B1 = new String(A); / create a new object String B2 = new String(A); / creat a new object checkInstance(B1, B2); / Result: They are different instances private static void checkInstance(String a1, String a2) if (a1 = a2) System.out.println(They are same instances); else System.out.p
17、rintln(They are different instances); 2) 应当用StringBuffer来做连接操作因为String是一个不变类,那么在做连接操作时,就会创建临时对象来保存中间的运算结果,而StringBuffer是一个mutable class,这样就不需要创建临时的对象来保存结果,从而提高了性能。4. JAVA Garbage Collection (Vincent)垃圾分代回收算法(Generational Collecting) 基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进
18、行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。 如上图所示,为Java堆中的各代分布。 1. Young(年轻代)JVM specification中的 Heap的一部份 年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制年老区(Tenured);。需要注意,Survivor的两个
19、区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。 2. Tenured(年老代)JVM specification中的 Heap的一部份 年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。 3. Perm(持久代) JVM specification中的 Method area 用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hib
20、ernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。采用分区管理机制的JVM将JVM所管理的所有内存资源分为2个大的部分。永久存储区(Permanent Space)和堆空间(The Heap Space)。其中堆空间又分为新生区(Young (New) generation space)和养老区(Tenure (Old) generation space),新生区又分为伊甸园(Eden space),幸存者0区(Survivor 0 space)和幸存者1区(Survivor 1 space)。具体分区
21、如下图: 那JVM他的这些分区各有什么用途,请看下面的解说。 永久存储区(Permanent Space):永久存储区是JVM的驻留内存,用于存放JDK自身所携带的Class,Interface的元数据,应用服务器允许必须的Class,Interface的元数据和Java程序运行时需要的Class和Interface的元数据。被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM时,释放此区域所控制的内存。 堆空间(The Heap Space):是JAVA对象生死存亡的地区,JAVA对象的出生,成长,死亡都在这个区域完成。堆空间又分别按JAVA对象的创建和年龄特征分为养老区和新生区。 新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面试 准备 要点 Java

链接地址:https://www.31ppt.com/p-1908947.html