1.编写一个java程序实现多线程,在线程中输出线程名字,每隔300毫秒输出一次,共输出10次。
实现方式一:继承Thread类。
public class Demo extends Thread{
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(300);
} catch (Exception e) {
System.out.println(e);
}
}
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.start();
}
}
实现方式二:实现Runnable接口,java不允许多继承,因此实现了Runnable接口的类可以再继承其他类。
public class Demo implements Runnable{
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(300);
} catch (Exception e) {
System.out.println(e);
}
}
}
public static void main(String[] args) {
// 将实现Runnable接口的类实例化。
Demo demo = new Demo();
// 建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法,最后通过Thread类的start方法建立线程。
new Thread(demo).start();
}
}
2.什么是webservice?Webservice接口协议是什么协议?WSDL的作用是什么?
Web Service也叫XML Web Service,WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
SOAP:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个XML文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
3.单例模式
class Singleton {
private static Singleton s;
private Singleton(){
System.out.println("A Singleton Model example");
}
public static Singleton getSigleton()
{
if(s==null)
s=new Singleton();
return s;
}
}
这种情况只能使用Singleton.getSigleton()获得一个实例,因为构造方法是private,所以不可能在别的函数里new()实例。
4.什么叫做SQL注入,如何防止?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防护
归纳一下,有以下几种方式
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
6.sql注入的检测方法一般采取辅助软件或网站平台来检测。
5.简述Hibernate中Session的1oad和get方法的区别
1.session.load()
这种方式总是会返回一个代理而不是真正地去查询数据库。在Hibernate里面,代理是一个依据ID值获取到的对象,该对象的属性还没有初始化,它看起来就是一个临时的虚拟对象而已。如果load方法没有找到数据,就会抛出ObjectNotFoundException.
2. session.get()
这种方式总是会去数据库查询数据并返回一个真实的对象,该对象就代表数据库中的一行而非代理。如果没有找到数据就会返回null.
6.Spring框架分为哪七大模块,各模块主要功能作用是什么?
七大模块,如下:
1.Spring Core:Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
2.Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。
3.Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
4.Spring ORM: ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
5.Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。
6.Spring Web: Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。
7.Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。
7.数据库锁的基本原理
为了保证数据的完整性和一致性,数据库系统采用锁来实现事务的隔离性。各种大型数据库采用的锁基本理论是一致的,但在具体实现上各有差别。
从并发事务锁定的关系上看,可以分为共享锁定和独占锁定。从锁定的对象不同,一般可以分为表锁定和行锁定。
共享锁用于读取数据操作,它是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新它。独占锁也叫排他锁,适用于修改数据的场合。它所锁定的资源,其他事务不能读取也不能修改。
当一个事务访问某种数据库资源时,如果执行select语句,必须先获得共享锁,如果执行insert、update或delete语句,必须获得独占锁,这些锁用于锁定被操作的资源。
当第二个事务也要访问相同的资源时,如果执行select语句,也必须先获得共享锁,如果执行insert、update或delete语句,也必须获得独占锁。此时根据已经放置在资源上的锁的类型,来决定第二个事务应该等待第一个事务解除对应资源的锁定,还是可以立刻获得锁。
8.事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
9.事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
10.事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
11.什么是反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。java通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象来调用类里面的方法。通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理。
12.页面导入样式时,使用link和@import有什么区别?
1.link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
2.页面被加载时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
13.html5有哪些新特性?
1、画布(Canvas)
画布是网页中的一块区域,可所以用JavaScript在上面绘图。
2、地址位置
Html5的地理位置特性可以返回网页访问者的地理位置
3、丰富强大的表单
HTML5提供了表单增强特性,这些功能是由复杂的JavaScript编写的,以便能在所有浏览器上工作.
4、本地存储
HTML5本地存储类似于cookies,但它支持存储的数据量更大,并且提供了一个本地数据库引擎,从而使保持和获取数据更加容易。这个特点可以很好的将数据分发给用户缓解与服务器的连接压力。另外可以使用JavaScript从本地Web页面中访问本地数据库,这意味着你可以将网页保存到你本地从公司回到家里不用连接互联网就能打开。
5、媒体
HTML5规范中最具亮点的部分也许就是HTML5浏览器内置的多媒体播放功能,不需要Flash、Microsoft Media Player等插件。
14.如何处理HTML5新标签的浏览器兼容题?
百度搜索“html5shiv.js”,下载后引入,就能解决在低版本浏览器不支持H5标签的问题了。
15.如何区分HTML和HTML5?
HTML声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
HTML5声明:
<!doctype html>
上面的两种声明,HTML5声明简洁方便人们的记忆,HTML声明太长了并且很难记住这段代码。
16.js的Undefined和Null的区别
Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
17.HTTP状态码知道哪些?
200状态码:表示请求已成功。
304自从上次请求后,请求的网页未修改过。
403状态码:服务器已经理解请求,但是拒绝执行它。
404状态码:请求失败,请求所希望得到的资源未被在服务器上发现。
500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
18.Struts2是如何实现 MVC?
Struts2的大致工作流程可描述为:
1、浏览器发送请求。
2、Control中的核心控制器FilterDispatcher根据请求调用相应的业务逻辑控制器(Action)。
3、WebWork的拦截器链自动对请求应用通用功能,如数据校验和文件上传等功能。
4、回调Action中的execute()方法,并在方法体内调用业务逻辑组件来处理请求(Model)。
5、execute()方法将调用业务逻辑组件(Model)得到的数据返还并更新视图层(View)。
19.请说说SpringMVC工作原理。
1.Spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller
3.DispatcherServlet将请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
20.请简单谈谈Hibernate和MyBatis各自的优点和缺点?
Hibernate的优点:
1、hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
2、功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。
3、有更好的二级缓存机制,可以使用第三方缓存。
4、数据库移植性良好。
5、hibernate拥有完整的日志系统,hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等。
Hibernate的缺点:
1、学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行。
2、hibernate的sql很多都是自动生成的,无法直接维护sql;虽然有hql查询,但功能还是不及sql强大,hql查询是有局限的;hibernate虽然也支持原生sql查询,但开发模式上却与orm不同,需要转换思维,因此使用上有些不方便。总之写sql的灵活度上hibernate不及mybatis。
Mybatis的优点:
1、易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
2、sql写在xml里,便于统一管理和优化,解除sql与程序代码的耦合。
3、提供映射标签,支持对象与数据库的orm字段关系映射。
4、提供对象关系映射标签,支持对象关系组件维护。
5、提供xml标签,支持编写动态sql。
6、速度相对于Hibernate的速度较快。
Mybatis的缺点:
1、关联表多时,字段多的时候,sql工作量很大。
2、sql依赖于数据库,导致数据库移植性差。
3、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4、对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。
5、DAO层过于简单,对象组装的工作量较大。
6、不支持级联更新、级联删除。
7、Mybatis的日志除了基本记录功能外,其它功能薄弱很多。
8、编写动态sql时,不方便调试,尤其逻辑复杂时。
9、提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
21.int 和Integer 有什么区别?
1.Java 提供两种不同的类型:引用类型和原始类型(或内置类型);int 是java 的原始数据类型,Integer 是java 为int 提供的封装类。
2.int不能为null值,Integer可以为null
22.ArrayList 和 Vector 的区别(是否有序、是否重复、数据结构、底层实现)
.ArrayList 和 Vector 都实现了 List 接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是
通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。
而 ArrayList 和 Vector 的区别主要在两个方面:
1.线程安全。Vector 是线程安全的,而 ArrayList 是线程不安全的。因此在如果集合数据只有单线程访问,
那么使用 ArrayList 可以提高效率。而如果有多线程访问你的集合数据,那么就必须要用 Vector,因为要保证数据安
全。
2.数据增长。ArrayList 和 Vector 都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就
需要增加它们的存储容量。ArrayList 每次增长原来的 0.5 倍,而 Vector 增长原来的一倍。ArrayList 和 Vector 都可以
设置初始空间的大小,Vector 还可以设置增长的空间大小,而 ArrayList 没有提供设置增长空间的方法。
23.HashMap 和 Hashtable 的区别
HashMap 和 Hashtable 都实现了 Map 接口,并且都是 key-value 的数据结构。它们的不同点主要在三个方面:
第一,Hashtable 是 Java1.1 的一个类,它基于陈旧的 Dictionary 类。而 HashMap 是 Java1.2 引进的 Map 接口
的一个实现。
第二,Hashtable 是线程安全的,也就是说是线程同步的,而 HashMap 是线程不安全的。也就是说在单线程环
境下应该用 HashMap,这样效率更高。
第三,HashMap 允许将 null 值作为 key 或 value,但 Hashtable 不允许(会抛出 NullPointerException)。
24.List 和 Map 区别?(数据结构,存储特点)
这个要从两个方面来回答,一方面是 List 和 Map 的数据结构,另一方面是存储数据的特点。
1.在数据结构方面:List 存储的是单列数据的集合,而 Map 存储的是 key、value 类型的数据集合。
2.在数据存储方面:List 存储的数据是有序且可以重复的,而 Map 中存储的数据是无序且 key 值不能重复(value 值可以重复)。
25.List、Map、Set 三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存 key-value 值,value
可多值
26.JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try 块中可以抛出异常吗?
Java 的异常处理是通过5个关键词来实现的:try、catch、throw、throws 和finally。一般情况下是用try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;
try 用来指定一块预防所有“异常”的程序;
catch 子句紧跟在try 块后面,用来指定你想要捕捉的“异常”的类型;
throw 语句用来明确地抛出一个“异常”;
throws 用来标明一个成员函数可能抛出的各种“异常”;
finally 为确保一段代码不管发生什么“异常”都被执行一段代码;
27.游标的特点有哪些?
1、允许定位在结果集的特定行。
2、从结果集的当前位置检索一行或一部分行。
3、支持对结果集中当前位置的行进行数据修改。
28.索引的作用及优缺点
索引的作用主要是为了在查询时提高查询的效率,并且尽量减小更新时的开销。
优点:设计良好的索引查询效率可以得到极大的提高,某些情况下甚至可以提高几百上千倍。
缺点:需要占用额外的空间和资源。在更新时耗费的时间更大,因为对数据的更新很有可能会导致索引的更新,这样就会导致增加系统开销。
29.请简要阐述事务的概念
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。也就是说,事务是由一系列的“原子”操作组成的,这些原子操作必须全部完成,否则所有的动作都会被取消并恢复到初始状态。开始事务使用BEGIN TRANSACTION 语句,以 COMMIT 或 ROLLBACK 语句结束。
以上是针对数据库来说的。
但是,事务不仅仅限于数据库,数据库以外的动作也可以被组合进事务中,一般称为“企业级事务”。举一个例子:我们有这两个操作必须都完成,即在向数据库插入一条记录后必须在硬盘的某个文件夹内创建一个文件,这个就是一个企业级事务,它超出了简单的数据库事务的范畴。我们可以通过编程来实现企业级事务。
30.存储过程和函数的区别
存储过程:功能强大,可以执行包括修改表等一系列数据库操作。可返回记录集。其返回值不能被直接引用,必须单独调用。
自定义函数:用户定义函数不能用于执行一组修改全局数据库状态的操作。可以返回表变量,也可以有任意个输出参数。其返回值可以被直接引用,也就是可以直接 select * from 函数。
31.请说一说 Jquery 中选择器分哪几种,常用选择有哪些
基本选择器
层次选择器
过滤选择器
简单过滤选择器
内容过滤选择器
可见性过滤选择器
属性过滤选择器
子元素过滤选择器
表单对象属性过滤选择器)
表单选择器
32.jQuery中的DOM操作可分为:
样式操作
内容及Value属性值操作
节点操作
节点属性操作
节点遍历
CSS-DOM操作
33.jsp的四种范围
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面。
request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)。
session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求。
application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
34.jsp中request对象的主要方法:
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
getParameterValues(String name):获得有name指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
35.forward() 与redirect()的区别?
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
36.SQL支持哪几种命令?
数据定义语言(DDL)、数据操纵语言(DML)、事务控制语言(TCL)、数据控制语言(DCL)
37.Oracle的表分区的作用?有哪几种类型?
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。
可分为:范围分区、散列分区、列分区、复合分区
38.存储过程参数的三种模式:
IN 用于接受调用程序的值
OUT 用于向调用程序返回值
IN OUT 用于接受调用程序的值,并向调用程序返回更新的值
39.触发器分类:
根据触发的次数分为:行级(每行都会触发),语句级(只触发一次)
根据触发的时间分为:前置(执行语句前触发)、后置(执行语句后触发)、替代(不执行语句)
触发器组成:
触发源:是什么对象触发的?通常是一个表或视图
触发事件:触发源的什么事件触发的?如插入、更新、删除等DML操作
触发时机:前置或后置,即在触发事件前触发还是后触发,还是直接替代触发事件
触发动作:触发器被触发时所执行的动作
40.Hibernate工作原理?
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
41.为什么要用Hibernate?
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。它很大程度地简化了DAO层的编码工作。
- hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
42.Hibernate对象的三种状态是什么?
瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。
1.瞬时态
由new命令开辟内存空间的java对象,eg. Person person = new Person(”amigo”, “女”);
如果没有变量对该对象进行引用,它将被java虚拟机回收。瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。
2.持久态
处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。
持久对象具有如下特点:1. 和session实例关联;2. 在数据库中有与之关联的记录。
3.脱管态
当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。
脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。
脱管对象具有如下特点:
- 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;
- 比瞬时对象多了一个数据库记录标识值。
43.Hibernate常用的主键生成策略有哪几种?
- assigned
主键由外部程序负责生成,无需Hibernate参与。 - increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。 - identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。 - sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。 - native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
44.什么是Spring
Spring是一个流行的轻量级J2EE开源应用程序框架,其核心理念是:1、简化J2EE的开发;2、整合各类框架;3、统一了对象依赖的配置方式;4、非侵入性,使得测试更加方便。
45.请说一下什么是 IOC ?什么是 AOP?
1、IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。
2、aop,面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
46.Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。
Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切入点,一个切入点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
47.Spring中用到的设计模式
工厂模式:IOC容器
代理模式:AOP
策略模式:在spring采取动态代理时,根据代理的类有无实现接口,有JDK和CGLIB两种代理方式,就是采用策略模式实现的
单例模式:默认情况下spring中的bean只存在一个实例
48.AOP的应用场景
权限,日志,处理异常,事务等等,个人理解就是把许多接口都要用的又和接口本身主要的业务逻辑无关的部分抽出来,写成一个切面,单独维护,比如权限验证。这样可以使接口符合“单一职责原则”,只关注主要的业务逻辑,也提高了代码的重用性。
49.Spring Bean的生命周期
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成:初始化之后调用的回调方法、销毁之前调用的回调方法。
50.jsp有哪些内置对象,有那些常用动作,有什么作用
JSP共有以下9种基本内置对象
request对象 客户端请求,此请求包含来自GET/POST的请求参数,通过它才能了解到客户的需求,然后做出响应。
response对象 响应客户端的请求的有关信息。
session对象 它是客户端与服务器的一次会话,从客户端到服务器的一个WebApplication开始,直到客户端与服务器的链接断开为止。
out 对象 它是JspWriter类的实力,是向客户端输出内容常用的对象
page对象 它指当前JSP页面本身,有点类似this指针,它是java.lang.object类的一个实例
application对象 它实现用户间的数据共享,可以改变全局变量,它从服务器启动开始直到服务器关闭。
exception对象 它是一个例外对象当一个页面的运行过程中发生了例外,就产生这个对象。
pageContext对象 它提供了对JSP页所有对象及名字空间的访问。
config对象 它是在一个Servlet初始化时,JSP引擎向它传递信息用的。
51.CS和bs的区别
Client/Server是建立在局域网的基础上的。Browser/Server是建立在广域网的基础上的
b/s最大的优势为客户端免维护,适用于用户群庞大,或客户需求经常发生变化的情况
c/s功能强大,可以减轻服务器端的压力,如果用户的需求特别复杂,用c/s
c/s对信息安全的控制能力很强,b/s对安全的控制能力相对弱
52.什么是MVC
MVC指MVC模式的某种框架,它强制性的使应用程序的输入、处理和输出分开。
使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
最典型的MVC就是JSP + servlet + javabean的模式。
52.ajax的运行机制
Ajax是在客户端与服务器端中间加上一层ajax引擎,主要是通过XMLHttpRequest对象来实现和服务器的一部份交互特性,借助DOM来实现局部刷新,异步性使用户体验连接
53.工厂模式:
分为以下三种:
1.简单工厂模式:又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例 ,违背开闭原则的.
2.工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
3.抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。
54.mybatis的工作流程:
1.MyBatis应用程序根据XML配置文件创建SqlSessionFactory,
2.SqlSessionFactory在根据配置获取一个SqlSession。
4.SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,
5.完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
55.拦截器和过滤器和监听器的区别
1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2.拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象
55.spring di
依赖注入 创建被调用者实例的工作通常由Spring容器完成,
然后注入调用者。
56.为什么使用依赖注入?
为了实现代码/模块之间松耦合。
57.数据库连接池
概念:数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
作用:
1.资源重用,避免了数据库连接频繁建立、关闭的开销
2.提高系统的响应速度
3.增强了系统在大量用户应用时的稳定性。
58.线程池
概述:在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程
1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
3.提高线程的可管理性。
59.什么是进程?什么是线程?什么是程序?它们三者之间的关系是如何?
进程是表示资源分配的基本单位;线程是进程中执行运算的最小单位;一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
60.volatile和synchronized的区别
• volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
• volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
• volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
• volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
• volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优
61.Error和exception有什么区别?
error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但是很 困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情 况;
Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问 题,如果程序正常运行就不会发生的情况
常见的exception 异常
空指针异常类:NullPointerException
文件未找到异常:FileNotFoundException
操作数据库异常:SQLException 输入输出异常:IOException
常见的error异常
java.lang.AbstractMethodError 抽象方法错误。当应用试图调用抽象方法 时抛出。 java.lang.AssertionError 断言错。用来指示一个断言失败的情况。 java.lang.ClassCircularityError 类循环依赖错误。在初始化一个类时, 若检测到类之间循环依赖则抛出该异常。 java.lang.ClassFormatError 类格式错误。当 Java 虚拟机试图从一个文件 中读取 Java 类,而检测到该文件的内容不符合类的有效格式时抛出。
62.http和https的区别
答:HTTP协议是一种使用明文传输数据的网络协议,默认端口80
HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密,默认端口443
63.什么是springboot
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 开发的难度,简省了繁重xml的配置,提供了各种启动器 。
64.为什么要使用springboot
Spring Boot 优点非常多,如:
独立运行 简化配置 自动配置 无代码生成和XML配置 无需部署war文件
65.Spring Boot 的核心配置文件有哪几个?它们的区别是什么
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用SpringCloudConfig配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
66.Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。
67.SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
68.开启SpringBoot特性有哪几种方式?
1.继承spring-boot-starter-parent项目
2.导入spring-boot-dependencies项目依赖
69.SpringBoot需要独立的容器运行吗?
可以不需要,内置了 Tomcat/ Jetty 等容器。
70.运行SpringBoot有哪几种方式?
1)打包用命令或者放到容器中运行
2)用 Maven/ Gradle 插件运行
3)直接执行 main 方法运行
71.Spring Boot 自动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
72.你如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术。
73.如何在 Spring Boot 启动的时候运行一些特定的代码?
可以实现接口 ApplicationRunner 或者 CommandLineRunner它们都只提供了一个 run 方法
74.Spring Boot 有哪几种读取配置的方式?
Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量,
75.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。
spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。
76.SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
Spring Loaded
Spring-boot-devtools
77.你如何理解 Spring Boot 配置加载顺序?
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
78.Spring Boot 如何定义多套不同环境配置?
提供多套配置文件,如:
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
79.Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
- 配置变更
- JDK 版本升级
- 第三方类库升级
- 响应式 Spring 编程支持
- HTTP/2 支持
- 配置属性绑定
80.什么是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
81.spring cloud 的核心组件有哪些?
• Eureka:服务注册于发现。
• Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
• Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
• Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
• Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
82.SpringCloud和Dubbo
SpringCloud和Dubbo都是现在主流的微服务架构
1.Rest和RPC对比
springCloud抛弃DubboRPC通信,采用的是基于HTTP的REST方式。
严格来说,这两种方式各有优劣,虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面原生RPC带来的问题,而REST相比RPC更为灵活,服务提供方和调用方的依赖只靠一纸契约,不存在代码级别的强依赖,这在强调快速烟花的微服务环境下,显得更加合适
2.文档质量和社区活跃度
springCloud的文档质量和社区活跃度要比dubbox好和高
83.SpringBoot和SpringCloud
SpringBoot专注于快速方便的开发单个个体的微服务
SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务
SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系
84.微服务之间是如何独立通讯的
1.远程过程调用(Remote Procedure Invocation):
也就是我们常说的服务的注册与发现
直接通过远程过程调用来访问别的service。
优点:
简单,常见,因为没有中间件代理,系统更简单
缺点:
只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应
降低了可用性,因为客户端和服务端在请求过程中必须都是可用的
2.消息:
使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。
优点:
把客户端和服务端解耦,更松耦合
提高可用性,因为消息中间件缓存了消息,直到消费者可以消费
支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应
缺点:
消息中间件有额外的复杂
85.负载均衡的意义是什么?
1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
2.提供故障转移,实现高可用;
3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);
86.springcloud如何实现服务的注册?
1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)
2.注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然后用ribbon或feign进行服务直接的调用发现。
87.什么是Hystrix?
防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)
88.什么是服务熔断?什么是服务降级
为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。
服务熔断:
一般是某个服务故障或异常引起,类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。
服务降级:
所谓的降级,一般是从整体负荷考虑,就是当某个服务熔断之后,服务将不再调用
此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值
这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强
89.微服务的优缺点分别是什么?说下你在项目开发中碰到的坑
优点
• 每一个服务足够内聚,代码容易理解
• 开发效率提高,一个服务只做一件事
• 微服务能够被小团队单独开发
• 微服务是松耦合的,是有功能意义的服务
• 可以用不同的语言开发,面向接口编程
缺点
• 分布式系统的负责性
• 多服务运维难度,随着服务的增加,运维的压力也在增大
• 系统部署依赖
• 服务间通信成本
• 数据一致性
• 系统集成测试
• 性能监控
90.你所知道的微服务技术栈?
• 维度(springcloud)
• 服务开发:springboot spring springmvc
• 服务配置与管理:Netfix公司的Archaiusm ,阿里的Diamond
• 服务注册与发现:Eureka,Zookeeper
• 服务调用:Rest RPC gRpc
• 服务熔断器:Hystrix
• 服务负载均衡:Ribbon Nginx
• 服务接口调用:Fegin
• 消息队列:Kafka Rabbitmq activemq
• 服务配置中心管理:SpringCloudConfig
• 服务路由(API网关)Zuul•
• 事件消息总线:SpringCloud Bus
91.Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性) A(可用性)和P(分区容错性),由于P分区容错是在分布式系统中必须要保证的,因此我们只能在A和C之间权衡
1.ZooKeeper保证的是CP,Eureka保证的是AP
ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的
Eureka各个节点是平等关系,只要有一台Eureka就可以保证服务可用,而查询到的数据并不是最新的
自我保护机制会导致
Eureka不再从注册列表移除因长时间没收到心跳而应该过期的服务
Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用)
当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性)
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper一样使得整个注册系统瘫痪
2.ZooKeeper有Leader和Follower角色,Eureka各个节点平等
3.ZooKeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题
4.Eureka本质上是一个工程,而ZooKeeper只是一个进程
92.eureka自我保护机制是什么?
当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
93.什么是Ribbon?
ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。feign默认集成了ribbon。
94.什么是feigin?它的优点是什么?
1.feign采用的是基于接口的注解
2.feign整合了ribbon,具有负载均衡的能力
3.整合了Hystrix,具有熔断的能力
使用:
1.添加pom依赖。
2.启动类添加@EnableFeignClients
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
95. Ribbon和Feign的区别?
1.Ribbon都是调用其他服务的,但方式不同。
2.启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
3.服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
4.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。
96. 什么是Spring Cloud Bus?
spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控。
如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置文件。
使用:
1.添加依赖
2.配置rabbimq
97.什么是SpringCloudConfig?
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。
在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
使用:
1、添加pom依赖
2、配置文件添加相关配置
3、启动类添加注解@EnableConfigServer
98.谈谈你对jvm的理解
Java虚拟机,一种能够运行java字节码的虚拟机,作为一种编程语言的虚拟机,实际上不只专用于java语言,只要生成的编译文件匹配jvm对加载编译文件格式要求,任何语言都可以由jvm编译运行,比如kotlin、scala等
Jvm有很多,不只是hostpot,还有jrockit、j9等等
Jvm的基本结构
Jvm由三个主要的子系统构成
-
类加载子系统
2.运行时数据区(内存结构)
3.执行引擎运行时数据区
黄色表示线程共享
蓝色表示线程私有
Jvm内存
线程运行时图
1.栈帧:前面说了,当线程执行到某个方法时就会往方法线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址(方法出口)、动态连接等信息
2.局部变量表:java中的局部变量
3.操作数栈:在执行运行执行操作,执行压栈和出栈
4.动态连接:将方法区里面的符号引用转为直接引用(即:给出地址)
5.方法返回地址(方法出口):方法的运行过程中,可能会正常退出,也可能会异常退出,不论是哪种退出