面试总结

一、spring设计目标

  一方面,spring提供轻量级开发平台,即使用pojo的开发方式,只需要使用简单的Java对象或者javabean就能进行javaEE开发;另一方面,通过Ioc容器来管理和维护业务中复杂对象的耦合关系,把原来对象-对象的关系变成 对象-Ioc容器-对象 的关系,从而实现对象之间关系的解耦。

二、Spring提供的常用组件服务

       比如事务处理,web MVC,JDBC,orm,远程调用

三、Spring核心 Ioc容器的实现

  1)BeanFactory的设计原理

 

jvm的内存管理:

  jvm在执行java程序的时候会把内存划分为若干个数据区域,有的区域随着虚拟机进程的启动而 存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

  1),程序计数器:可以看作当前线程所执行的字节码的行号指示器,线程通过程序计时器来选取下一条需要执行的字节码指令,线程私有内存

  2),虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时 都会创建一个栈帧(Stack Frame )用于存储局部变量表、操作数栈、动态链接、方法出口 等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出 栈的过程。

  3),本地方法栈:与虚拟机栈所发挥的作用是非常相似的,它们之间 的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚 拟机使用到的Native方法服务。

  4),堆:Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就 是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”

  5),方法区:与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚 拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

对象的创建过程

  类加载检查-------内存分配---------将分配到的内存空间都初始化为零值(不包括对象头)-----------要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找 到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对 象头(Object Header)之中 ---------执行<init>方法把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完 全产生出来。

类的加载过程

  1)加载;

    1)通过一个类的全限定名来获取定义此类的二进制字节流。

    2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

    3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据 的访问入口。

  加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之 中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据 结构。然后在内存中实例化一个java.lang.Class类的对象(并没有明确规定是在Java堆中,对 于HotSpot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区里面),这 个对象将作为程序访问方法区中的这些类型数据的外部接口。

  2)验证;这一阶段的目的是为了确保Class文件的字节流中包含的信息 符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  3)准备;正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存 都将在方法区中进行分配。

  4)解析;虚拟机将常量池内的符号引用替换为直接引用的过程

  5)初始化;初始化阶段是执行类构造器<clinit>()方法的过程

posted @ 2017-09-12 13:34  山鬼幽篁  阅读(112)  评论(0编辑  收藏  举报