wmic cpu get processorid获取的都一样_该面试了吧,这些你都要记得哦

一、解释堆(stack)、栈(heap)、方法区(method area)。

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

0ca5fd22a3bf62abd1c8723958122bcd.png

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

理论上java因为有垃圾回收机制所以是没有内存泄漏的,这也是java被广泛用于服务器端编程的重要原因,然而在实际的开发中,可能会存在无用但可达的对象,这些对象无法被GC回收,因此也会有内存泄漏的发生,例如Hibernate的一级缓存对象属于持久态,是不会被回收的,这些对象中会存在无用的对象,如果不及时关闭或清空一级缓存对象就可能导致内存泄漏。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError(内存溢出)。

三、抽象方法(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语句然后为事务访问的资源加上合适的锁。需要说明的是,事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高并发性就越差。所以要根据具体的应用来确定合适的事务隔离级别,这个地方没有万能的原则。

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

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

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

---代理模式:给对象提供一个代理对象,由代理对象控制对原对象的引用。

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

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

ae12de37608fd3df4bf1fff493464ec1.png

挑自己最熟悉的,切记言多必失。

十三、转发和重定向的区别?

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

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

forward更加高效,所以满足需求的情况下用forward。有助于隐藏实际的链接。 有些情况下爱,比如需要访问其他服务器上的资源,则必须用 redirect。

十四、get和post的区别。

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

post:用来向服务器提交数据,post 是将表单中的数据放在http协议中的请求头或消息体中。

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

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

对于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中的静态包含和动态包含区别

静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。

二十、什么是 Web Service?

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

这里提到一个 概念:SOA 面向服务 的架构,SOA是一种思想,它将应用程序的不同功能单元通过中立的契约联系起来,独立于硬件平台,操作系统和编程语言,使得各种形式的单元可以更好的集成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值