一样平常时候,定义一个基本数据类型的变量,函数方法的实行,一个工具的引用都是JVM的栈空间; 通过new关键字和布局器创建的工具都是占用的堆空间,堆是垃圾回收器紧张场所。
方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量和编译器编译之后的代码,常量池也是方法区的一部分。
栈空间操作最快但是内存很小,常日大量的工具都是存在堆空间的。
栈和堆 的大小都是可以通过JVM的启动参数来调度的,栈空间用光了会引发StackOverflowError,而堆和常量池空间不敷则会引发OutOfMemoryError。

二、java中会存在内存泄露吗?

理论上java由于有垃圾回收机制所以是没有内存泄露的,这也是java被广泛用于做事器端编程的主要缘故原由,然而在实际的开拓中,可能会存在无用但可达的工具,这些工具无法被GC回收,因此也会有内存泄露的发生,例如Hibernate的一级缓存工具属于持久态,是不会被回收的,这些工具中会存在无用的工具,如果不及时关闭或清空一级缓存工具就可能导致内存泄露。
在支持垃圾回收的措辞中,内存透露是很暗藏的,这种内存透露实在便是无意识的工具保持。
如果一个工具引用被无意识的保留起来了,那么垃圾回收器不会处理这个工具,也不会处理该工具引用的其他工具,纵然这样的工具只有少数几个,也可能会导致很多的工具被打消在垃圾回收之外,从而对性能造成重大影响,极度情形下会引发Disk Paging(物理内存与硬盘的虚拟内存交流数据),乃至造成OutOfMemoryError(内存溢出)。

jsp标准动作不包括该面试了吧这些你都要记得哦 Vue.js

三、抽象方法(abstract)是否可以是静态的(static)、本地方法(native)、是否可以被synchronized润色?

都不能,抽象方法须要子类重写。
而静态的方法是无法被重写的。
本地方法是本地代码实现的,抽象方法是没有实现的。
synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互抵牾的。

四、如何实现字符串的反转及更换?

public static String reverse(String originStr) {

if(originStr == null || originStr.length() <= 1) return originStr;

return reverse(originStr.substring(1)) + originStr.charAt(0); }

五、Thread类中的wait和sleep都可以使线程停息,差异是什么?其余线程和进程的描述。

sleep方法是静态方法,会停息指定时间,将实行机会让给别的线程,但是会持有工具锁,韶光到了,自动到就绪状态。
wait是Object类的方法,会放弃工具锁,进入等待池,只有调用 notify方法,才能唤醒。

大略的说:进程是具有一定独立功能的程序关于某个数据凑集上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。
线程的划分尺度小于进程,这使得多线程程序的并发性会更高,进程在实行时常日拥有独立的内存单元,而线程之间可以共享内存。
使得多线程会带来更好的用户体验和性能,但是多线程对付其他程序是不友好的,由于他可能霸占了更多的CPU,当然,也不是线程越多,程序的性能就越好,由于线程之间的调度和切换也会摧残浪费蹂躏CPU韶光。
时下很时髦的Node.js就采取了单线程异步I/O的事情模式。

六、举例解释同步和异步

如果线程中存在临界资源(资源数量小于竞争资源线程数量),如正在写的数据被读到,正在读的数据被别的线程写过了,那么这些数据必须进行同步存取(例如数据库中 排他锁),当运用程序在工具上调用了一个实行韶光很长的方法,并且不肯望让程序等待方法的返回,就该当利用异步编程,实在,所谓的同步便是壅塞式操作,而异步就是非壅塞式操作。

七、线程池及其干系

在面向工具编程中,创建和销毁工具是很费韶光的,由于创建工具要分配内存资源,虚拟机将试图跟踪每一个工具,以便能够在工具销毁后进行垃圾回收。
以是提高效率的一个手段便是 减少创建工具和销毁工具的次数,特殊是很耗资源的那种,这便是“池化资源”的技能产生缘故原由,线程池便是 事先创建多少个可实行的线程放在池中,也便是容器中,须要的时候获取线程不用自行创建,利用完毕后放回池中,从而减少创建和销毁线程工具的开销。

这是范例的用空间换取韶光的策略,数据库连接池也是一样的道理,还是为了减少资源的开销。

创建线程池的方法,网上可详查。

其余,Lock和synchronized 有哪些异同? Lock能完成后者的所有,紧张不同在于Lock比sychronized 有更精确的线程语义和性能,而且不逼迫哀求一定要得到锁,需手动开释锁,在finally。

八、线程的基本状态和关系

解释:个中Running表示运行状态,Runnable表示就绪状态(万事俱备,只欠CPU),Blocked表示壅塞状态,壅塞状态又有多种情形,可能是由于调用wait()方法进入等待池,也可能是实行同步方法或同步代码块进入等锁池,或者是调用了sleep()方法或join()方法等待休眠或其他线程结束,或是由于发生了I/O中断。

九、java实现工具序列化的意义

序列化便是用来处理工具流的机制,便是将工具的内容进行流化,可以对流化的工具进行读写操作,也可以将流化的工具传输于网络之间,序列化便是为理解决工具流在读写操作中可能产生的问题(如果不进行序列化可能会存在数据乱序的问题)。

十、Statement和PrepareStatement差异

与Statement比较,PrepareStatement接口代表预编译的语句,他的紧张上风在于可以减少SQL的编译缺点并增加SQL的安全性,它还可以带参数,避免了用字符串拼接SQL语句的麻烦和不屈安,当批处理SQL或频繁实行相同的查询,后者带有性能上的上风,由于数据库可以将编译优化后的SQL语句缓存起来,下次实行相同的语句就会很快。

十一、事务的ACID

原子性,同等性,隔离性,持久性

口试中问到事务很多的,首先须要知道的是,只有存在并发数据访问时才须要事务,当多个事务访问同一数据时,可能会存在五类问题,包括3类数据读取问题(脏读,不可重复读,幻读)和2类数据更新问题。

数据库常日会通过锁机制来办理数据并发访问问题,按锁定工具不同可以分为表级锁和行级锁;按并发事务锁定关系可以分为共享锁和独占锁,详细的内容大家可以自行查阅资料进行理解。
直策应用锁是非常麻烦的,为此数据库为用户供应了自动锁机制,只要用户指定会话的事务隔离级别,数据库就会通过剖析SQL语句然后为事务访问的资源加上得当的锁。
须要解释的是,事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高并发性就越差。
以是要根据详细的运用来确定得当的事务隔离级别,这个地方没有万能的原则。

十二、说一下你用过的设计模式。

口试被问到关于设计模式的知识时,可以拣最常用的作答,例如:

---工厂模式:工厂类可以根据条件天生不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。
当得到子类的实例后,开拓职员可以调用基类中的方法而不必考虑到底返回的是哪个子类的实例。

---代理模式:给工具供应一个代理工具,由代理工具掌握对原工具的引用。

---适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使因接口不匹配而无法在一起利用的类能够一起事情。

---模板方法模式:供应一个抽象类,将部分逻辑以详细方法或布局器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑,不同的子类可以以不同的办法实现这些抽象方法(多态实现),从而实现不同的业务逻辑。

挑自己最熟习的,牢记言多必失落。

十三、转发和重定向的差异?

forward:做事器要求资源,做事器直接要求访问地址, 把那个地址的内容读取过来发送给浏览器,浏览器根本不知道内容是从哪里来的,以是他的地址还是原来的地址。

redirect:便是做事器根据逻辑,发送一个状态码,见告浏览器去访问这个地址,因此可以看到之后的地址。

forward更加高效,以是知足需求的情形下用forward。
有助于隐蔽实际的链接。
有些情形下爱,比如须要访问其他做事器上的资源,则必须用 redirect。

十四、get和post的差异。

get是从做事器上获取资源; 将表单中的数据按照 name--value的格式放在url后面; get传输的数据更小; 利用get时参数会显示在地址栏上。

post:用来向做事器提交数据,post 是将表单中的数据放在http协议中的要求头或体中。

十五、如何实现JSP和servlet的单线程模式?

对付jsp页面,可以通过page进行设置

<%@page isThreadSafe=”false”%>

对付servlet 可以让实在现SingleThreadMode接口

如果两者都是单线程,每个要求都会创建一个Servlet实例,严重性能问题和频繁的垃圾回收。

十六、实现会话跟踪的技能有哪些?

HTTP协议本身无状态, 做事器为了区分不同的用户,会对其会话进行跟踪,为用户进行登记。

最常用的是 cookie和session,cookie有两种,一种是基于窗口的,浏览器关闭后,cookie就没有了;另一种是将信息存在一个了临时文件中,并设置存在韶光,当用户通过浏览器与做事器建立了一次会话后,会话id就会随相应信息返回存储在基于窗口的cookie中,那就意味着浏览器没有关闭,会话没有超时,下一次要求这个会话id又会提交给做事器让做事器识别用户身份。

session:当用户第一次访问某个网站时,会自动创建session,session存在做事器的内存中,不能将太大的工具放在session,且工具工具最好实现了Serializable接口,否则在序列化中会涌现非常。

十七、简述过滤器

过滤器是一个在驻留在做事器真个web组件,它可以截取 客户端和做事器之间的要乞降相应信息,并且过滤,当web容器吸收到一个对资源的要求时,将会判断是否与过滤器有关,如果有,web容器将会把要求交给过滤器处理,在过滤器中,你可以改变要求的内容,重新设置头信息,然后在发送给目标资源。
当目标资源做出相应后,也会给过滤器,处理,发送到客户端。

常见的过滤器用场: 对用户要求统一认证,对用户的访问进行记录和审核,对发送的数据进行过滤和更换,对要求或相应进行加密和解密,触发资源访问事宜。

和过滤器干系的接口紧张有:Filter、FilterConfig和FilterChain。

十八、简述监听器

java web中的监听器便是application、session、request三个工具创建、销毁或者往个中添加、修正、删除属性时自动实行代码的功能的组件。

十九、jsp中的静态包含和动态包含差异

<%-- 静态包含 --%>

<%@ include file=\公众...\公众 %>

<%-- 动态包含 --%>

<jsp:include page=\公众...\"大众>

<jsp:param name=\公众...\"大众 value=\公众...\公众 />

</jsp:include>

静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作<jsp:forward>包含页面。
静态包含是编译时包含,如果包含的页面不存在则会产生编译缺点,而且两个页面的\公众contentType\公众属性应保持同等,由于两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。
动态包含是运行时包含,可以向被包含的页面通报参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译缺点,也不影响页面其他部分的实行。

二十、什么是 Web Service?

Web Service 便是一个运用程序,它向外界暴露了一个可以通过web调用的API,便是说你可以通过编程调用这个运用程序而不须要知道里面的细节,它是通过HTTP协议传输数据。

这里提到一个 观点:SOA 面向做事 的架构,SOA是一种思想,它将运用程序的不同功能单元通过中立的左券联系起来,独立于硬件平台,操作系统和编程措辞,使得各种形式的单元可以更好的集成。