堆和栈有什么区别?
答:堆用new建立,垃圾自动回收负责回收
堆是一个“运行时”数据区,类实例化的对象就是从堆上去分配空间的,在堆上分配空间是通过“new”等指令建立的Java针对堆的操作金额C++的区别就是,java不需要在空间不用的时候来显式的释放Java的堆是由java的垃圾回收机制来负责处理的,堆是动态分配内存大小,垃圾收集器可以自动回收不使用的内存空间缺点是,因为在啊运行时动态分配内存,索取内存的存取速度较慢。栈中主要存放一些基本类型的变量(int,short,long,byte,float,double,boolean,char)和对象句柄;栈的存取速度要比堆快栈数据可以共享;建的数据大小与生存期必须是确定的,缺乏灵活性。
主要的俩点是:
(1)堆主要放new的对象,而栈放基本类型和句柄,句柄指向的是堆。 (2)垃圾回收的时候回收的是堆,栈比较难回收,一般不回收
堆内存中到底存放什么东西?
答 :
存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)Jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身栈区:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。方法区:1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
类变量和实例变量有什么区别?
答 :类变量是所有对象公有,其中一个对象将他值改变,其他对象得到的就是改编后的结果。
实例变量则属对象私有,莫一个对象将其值改变,不影响其他对象
Java 的方法(函数)到底是传值还是传址?
答:都不是,是以传值的方式传递地址,具体的说原生数据类型传递的值,引用类型传递的地址。
对于原始数据类型,jvm的处理方法是从methodArea(方法区)或heap中拷贝到stack,然后运行frame中的方法,运行完毕后再把变量拷贝回去。
为什么会产生 OutOfMemory?
答:heap内存中没有足够的可用内存了。不是没有,是新申请的内存的对象大于heap空闲内存。
我产生的对象不多呀,为什么还会产生 OutOfMemory,可能原因是什么?
答:继承层次太多,heap中产生的对象是先产生父类,才产生子类
为什么会产生 StackOverflowError?
答:一个线程吧stack内存全部耗尽了,一般是递归函数造成的
一个机器上可以有多个 JVM 吗? JVM 之间可以互访吗?
答:可以有多个jvm,只要机器能承受的来,jvm之间不可以互访。
9. 为什么 Java 要采用垃圾回收机制,而不采用 C/C++的显式内存管理?
答:为了简单。
10.为什么你没有详细介绍垃圾回收机制?
答:垃圾回收机制每个jvm都不同,jvm specification只是定义了要制动释放内存,也就是说它只定义了垃圾回收的抽象方法,具体怎么实现各个厂商都不同,算法各异。
11. JVM 中到底哪些区域是共享的?哪些是私有的?
答:heap和method Area是共享的,其他都是私有的
什么是 JIT?
答:JIT 是指Just In Time, 即时编译器
为什么不建议在程序中显式的声明 System.gc()?
答:因为显式声明是在做堆内存全扫描,也就是FULL GC,是需要停止所有的活动的
14. JVM 有哪些调整参数?
-Xms:设置jvm内存的初始大小
-Xmx:设置jvm内存的最大值
-Xmn:设置新域的大小
-Xss:设置每个线程的堆栈大小
-XX:NewRatio:设置新域与旧域之比 如-XX:NewRatio=4就表示新域与旧域之比为1:4
-XX:NewSize:设置新域的初始值
-XX:MaxNewSize:设置新域的最大值
-XX:MaxPermSize:设置永久域的最大值-XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个Survivor区则用来存放每次垃圾回收后存活下来的对象)
15. Jquery?
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
Struts2的执行流程
1 浏览器发送请求,经过一系列的过滤器后,到达核心过滤器 (StrutsPrepareAndExecuteFilter).
2 StrutsPrepareAndExecuteFilter 通过ActionMapper判断当前的请求是否需要某个 Action处理,如果不需要,则走原来的流程。如果需要则把请求交给 ActionProxy来处理
3 ActionProxy通过Configuration Manager询问框架的配置文件 (Struts.xml),找到需要调用的 Action类;
4 创建一个 ActionInvocation实例,来调用 Action的对应方法来获取结果集的 name,在调用前后会执行相关拦截器。
5 通过结果集的 Name知道对应的结果集来对浏览器进行响应。
Spring是什么?
spring是J2EE应用程序框架 ,是轻量级的IoC和AOP的容器框架(相对于重量级的EJB),主要是针对 javaBean的生命周期进行管理的轻量级容器 ,可以单独使用,也可以和 Struts框架, ibatis框架等组合使用。
IOC(Inversion of Control )或DI(Dependency Injection)
IOC控制权反转
原来:我的Service需要调用 DAO,Service就需要创建 DAO
Spring:Spring发现你 Service依赖于 dao,就给你注入 .
核心原理:就是配置文件+反射(工厂也可以)+容器(map)
AOP:面向切面编程
核心原理 :使用动态代理 的设计模式在执行方法前后或出现异常做加入相关逻辑 。
我们主要使用 AOP来做:
1、事务处理
2、权限判断
3、日志
4、....
1.springmvc入口是一个servlet前端控制器(DispatcherServlet),struts2入口是一filter过滤器(StrutsPrepareAndExecuteFilter).
2.struts2通过在action类中定义成员变量接收参数,(属性驱动和模型驱动),它只能使用多例模式管理action.
springmvc通过在coontroller方法中定义形参接收参数,springmvc可以使用单例模式管理controller.
3.springmvc是基于方法开发的,注解开发中使用requestMapping将url和方法进行 映射,如果根据url找到controller类的方法生成一个handler处理器对象(只包括一个method).
struts2是基于类开发的,每个请求过来创建一个action实例,实例对象中有若干个方法.
开发中建议使用springmvc,springmvc方法更类似service业务方法.
4.struts2采用值栈存储请求和相应的数据,通过OGNL存取数据,springmvc通过参数绑定期将request请求内容解析,并给方法形参赋值.
5.struts2和springmvc的速度是相当的,由于struts2的漏洞较多,跟多企业使用springmvc
相同点:
(1)Hibernate与MyBatis都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由Session来开启执行事务和SQL(Structured Query Language,结构化查询语言)语句。
(2)Hibernate和MyBatis都支持JDBC(Java DataBase Connectivity,java数据库连接)和JTA(Java Transaction API,Java事务API(Application Programming Interface,应用程序编程接口))事务处理。
注:jdbc和jta的主要作用是增强数据访问能力。
(3)基于ORM(Object Relational Mapping, 对象关系映射)思想解决了entity和数据库的映射问题
不同点:
(1):sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
(2):缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。
Mybatis是什么
首先Mybatis是一个对象关系映射(Object Relational Mapping,简称ORM)框架
,是为了解决面向对象与关系数据库存在的互不匹配的现象。也就是说Mybatis的
关注点在于对象与数据库之间的映射,Mybatis会把从数据库中得到的松散数据进
行封装,使开发者直接拿到一个对象。Mybatis其实是对jdbc的操作数据库的过程
进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册
驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂
的过程代码。 而切Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生
成接口的具体实现,使用起来变得更加省事和方便。这可以说是Mybatis最重要的
改进。
你对 Spring 的理解。
1.Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为 BeanFactory(实际上是一个接口),在程序中通常 BeanFactory的子类ApplicationContext。Spring相当于一个大的工厂类,在其配置文件中通过 <bean>元素配置用于创建实例对象的类名和实例对象的属性。
2. Spring提供了对 IOC良好支持, IOC是一种编程思想,是一种架构艺术,利用这种思想可以很好地实现模块之间的解耦。 IOC也称为DI(Depency Injection),什么叫依赖注入呢?
3. Spring提供了对 AOP技术的良好封装, AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为 AOP。实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在, JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用 CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以 Advice对象进行提供,显然要创建出代理对象,至少需要目标类和 Advice类。
Hibernate的理解
1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。
2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。从 Java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很不起眼的附属功能, java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的 jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。
3.通过数据库保存 java程序运行时产生的对象和恢复对象,其实就是实现了 java对象与关系数据库记录的映射关系,称为 ORM(即Object Relation Mapping),人们可以通过封装 JDBC代码来实现了这种功能,封装出来的产品称之为 ORM框架,Hibernate就是其中的一种流行 ORM框架。使用 Hibernate框架,不用写 JDBC代码,仅仅是调用一个 save方法,就可以将对象保存到关系数据库中,仅仅是调用一个 get方法,就可以从数据库中加载出一个对象。
4.使用Hibernate的基本流程是:配置 Configuration 对象、产生 SessionFactory、创建session对象,启动事务,完成 CRUD操作,提交事务,关闭 session。
5.使用Hibernate时,先要配置 hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的 hbm.xml文件,hibernate.cfg.xml文件中需要登记每个 hbm.xml文件。
6.在应用Hibernate时,重点要了解 Session的缓存原理,级联,延迟加载和 hql查询。
Struts的理解
1. struts是一个按 MVC模式设计的 Web层框架,其实它就是一个大大的 servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在 web.xml文件中将符合某种特征的所有请求交给这个 Servlet处理,这个 Servlet再参照一个配置文件(通常为 /WEB-INF/struts-config.xml )将各个请求分别分配给不同的 action去处理。
一个扩展知识点: struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;
2. ActionServlet把请求交给 action去处理之前,会将请求参数封装成一个 formbean对象(就是一个 java类,这个类中的每个属性对应一个请求参数),封装成一个什么样的 formbean对象呢?看配置文件。
3.要说明的是, ActionServlet把formbean对象传递给 action的execute方法之前,可能会调用 formbean的validate方法进行校验,只有校验通过后才将这个 formbean对象传递给 action的execute方法,否则,它将返回一个错误页面,这个错误页面由 input属性指定,(看配置文件)作者为什么将这里命名为 input属性,而不是 error属性,我们后面结合实际的运行效果进行分析。
4.action执行完后要返回显示的结果视图,这个结果视图是用一个 ActionForward 对象来表示的, actionforward 对象通过 struts-config.xml配置文件中的配置关联到某个 jsp页面,因为程序中使用的是在 struts-config.xml配置文件为 jsp页面设置的逻辑名,这样可以实现 action程序代码与返回的 jsp页面名称的解耦。
你对struts可能还有自己的应用方面的经验,那也要一并说出来。
谈谈你对springmvc的理解
先说:SpringMVC工作原理
SpringMvc是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类;SpringMvc工作时主要是通过DispatcherServlet管理接收到的请求并进行处理。
具体执行流程如下:
SpringMVC工程流程描述
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。