Advertisement

java基础面试题-看我这一篇就够了

阅读量:

基础面试题精选

一、String, StringBuffer, StringBuilder各自有什么不同?如何实现不可变性?

  1. String是一个字符串常量(String是一个不可变对象)。其中StringBuffer和StringBuilder都是字符串变量。
  2. StringBuffer具有良好的线程安全性。
  3. StringBuilder不具备线程安全性。
  4. 具体来说,在Java语言中,String是一个不可变对象(String类是由final修饰的类),每次对一个String对象进行修改实际上是创建一个新的对象(补充知识点
  5. StringBuffer是可变的对象,在每次修改时仅针对自身进行操作(不像string可能会引用常量池中已存在的对象),因此在大多数情况下比String具有更高的效率,并且实现了同步操作(synchronized),从而保证了其线程安全性。
  6. 与之相比的是,在没有同步的情况下(即非阻塞模式),StringBuilder不具备线程安全性。不过需要注意的是,在多线程环境下,默认情况下如果不设置特定参数,默认情况下也是非阻塞模式的。然而,在单线程环境下,默认情况下其实也是非阻塞模式吗?这需要进一步验证。(补充知识点:如果希望提升性能,则建议在使用时指定适当容量大小)具体而言,在多线程环境下,默认情况下如果不设置特定参数,默认情况下也是非阻塞模式吗?这需要进一步验证。(补充知识点:如果希望提升性能,则建议在使用时设置适当容量大小)具体而言,在多线程环境下,默认情况下如果不设置特定参数,默认情况下其实也是非阻塞模式吗?这需要进一步验证。(补充知识点:如果希望提升性能,则建议在使用时设置适当容量大小)具体而言,在多线程环境下,默认情况下如果不设置特定参数,默认情况下其实也是非阻塞模式吗?这需要进一步验证。

二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

该技术方案采用线程安全机制(参考:https://www.cnblogs.com/nufangrensheng/p/3521654.html),其中涉及到的主要对象包括向量、ArrayList以及LinkedList三种不同类型的集合容器。从基础架构来看,向量与ArrayList都是基于object[]数组实现的。然而,在考虑到向量在多线程环境下的高效安全性之后发现,在单线程环境下运行速度更快的ArrayList相比Vector表现出更优的表现。由于其对数据元素的操作具有较高的并发兼容性,在实际应用中被广泛应用于需要频繁增删操作的应用场景中。而相对于ArrayList而言,LinkedList则在运行速度方面表现更为出色,在内存占用方面则相对较高。

三、HASHTABLE, HASHMAP,TreeMap区别?

两者均实现了Map接口这一共有性特征,在核心功能上存在差异:前者(Hashmap)具备良好的并发性能而后者(Hashtable)提供了更强的安全性保障。在数据完整性方面存在明显区别:前者允许多个键值对共享同一个键或值(即键值均可设为null),而在Hashtable中必须保证键与值的独特性以避免冲突。从适用场景的角度来看,在HashMap的基础上实现了一套更为简单的缓存机制以满足单线程环境下的快速响应需求;而Hashtable则更适合多线程环境下需要严格控制同步操作的应用场景。在哈希函数的具体实现细节上两者的差异更为显著:Hashtable采用的是基于旧散列结果进行扩展的一次性计算方式(old*2+1),而后者则是基于二进制指数形式的设计方案;此外Hashtable默认使用的散列基数也为固定值16这与前者的默认设置存在明显区别。
该类数据结构能够根据键值进行有序排列并支持自定义排序方式,默认情况下将按照升序顺序组织数据以满足大多数场景的需求。

四、ConcurrentHashMap和HashTable的区别?

两者均被广泛应用于多线程环境中;然而在HashTable规模达到一定规模时,其运行效率显著降低(涉及使用同步关键字与JVM内存计数器分配CPU时间开销)。由于在迭代过程中需要长时间等待同步,因此其性能表现较差。相比之下,在Java实现中的ConcurrentHashMap采用了更为高效的方式:该数据结构采用分段策略以减少同步竞争,从而能够有效提升性能表现

五、Tomcat,apache,jboss的区别?

Tomcat充当着一个关键组件的角色,在处理jsp以及相关的servlet功能时展现出卓越的能力;它具备轻盈高效的特点,在性能方面表现尤为突出;然而它不具备对EJB的支持能力,在应用受限方面显得略显不足;因此在Java开发环境中它主要用于构建基础的应用架构

Apache充当了HTTP服务器角色,并被视为Web服务系统。与IIS相比,Apache主要用于构建虚拟网站,并负责处理静态网页的内容。它采用了SSL技术确保数据传输安全,并能同时支持多个虚拟主机的功能。

JBOSS 是一种服务平台,在 JavaEE 技术框架下运行 EJB 应用服务器,并遵循 JavaEE 标准提供更为丰富和支持的组合功能。它通过集成其他 Servlet 容器实现了对 Servlet 的支持,并在遵循 JavaEE 标准的基础上提供了更为丰富组合功能与多样化支持能力。例如 Tomcat 这样的 Servlet 容器实现了对 Servlet 的支持。

六、GET与POST的区别是什么?(总结不够完善,请参考https://www.cnblogs.com/logsharing/p/8448446.html) GET请求方式会将参数直接嵌入URL中,并不会泄露敏感信息;而POST请求方式则会将数据放置在HTTP request body中,并且会在响应头中携带相关信息标记。因此,在某种程度上来说POST更为安全。

get操作将参数数据队列附加至表单提交的action属性指向的URL,并实现其值与表单中的各个字段及其内容一一对应。通过查看URL中的配置信息可以进一步了解具体参数设置情况。而post则是通过HTTP POST机制将表单内的各项字段及其内容整合至HTTP响应头域(如HTML页面的header部分)后发送至目标URL地址。

对于GET方法,在服务端使用request.QueryString获取变量值,在HTTP协议中采用GET方法时,默认情况下客户端会发送请求地址至资源地址的一部分(通常是路径),而该路径部分(通常是默认情况下)会被忽略或者不被处理。而在HTTP协议中采用POST方法时,默认情况下客户端会发送请求地址至资源地址的一部分(通常是路径),而该路径部分(通常是默认情况下)会被忽略或者不被处理。GET方法传输的数据量相对较小(普遍情况下大多数浏览器对URL长度的限制为2千字节),而POST方法一般不受限制。从安全性的角度来看,GET方法的安全性略逊于POST方法,在某些特殊场景下可能面临一定的安全风险;但从执行效率的角度来看,则GET方法相对较高)。

七、SESSION, COOKIE区别?

以下是对原文的同义改写

Session数据被存储在服务器端

Session会在指定时间段内存在于服务器中

单个 cookie 保持的数据不超过4k

eight,Servlet的生命周期(老铁,一定要看这个,这个关系到
分为三个主要阶段:初始化期——启动init()方法,响应期——执行service()方法处理客户端请求,终止期——调用destroy方法释放资源。其运行机制如下:客户端向服务器发送请求,Web容器(如Tomcat)从本地存储中加载servlet.class文件,生成Servlet实例(若无则直接创建)。随后,Servlet将调用service()方法来处理客户端请求,具体流程包括接收并解析请求信息→触发相应的业务逻辑→返回响应数据→完成整个服务流程。若要自定义Servlet需实现对应的Servlet接口.当Web容器关闭后会自动执行destroy()方法以释放实例.其完整生命周期包含以下环节:从加载Servlet开始到最终销毁的过程;其中涉及创建Servlet实例以及启动其init()方法;随后针对接收到的客户端请求建立相关对象;接着通过service()方法整合这些对象进行处理;在整个服务流程中,Servlet会根据业务需求动态激活其他中间层组件(如doGet(), doPost()等)来进一步处理复杂操作.

第九章 HTTP 请求体携带信息包(其中包含详细内容如此处可点击访问

请修改如下内容:
请求方法包括GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE。请求头如:Host、User-Agent、Connection、Accept-Charset等。请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。请求正文为可选部分,如get就没有。
十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入?

采用预定义语句集(PreparedStatement)有助于增强代码易懂性和维护性,并且能够尽可能地优化性能。然而Statement每次执行SQL命令时都会重新编译其语法结构以实现独立性需求;而PreparedStatement仅需编译一次即可满足多条命令的需求。PreparedStatement类似于流水线作业机制,在提升效率的同时也简化了操作流程;另一方面能够显著增强安全性:它强制执行参数类型转换以确保与数据库内部格式保持一致

SQL注入是指通过向Web表单提交或输入域名或页面请求中的查询字符串来嵌入SQL命令的行为。例如,在提交时可能会向服务器发送包含SQL指令的查询字符串以达到欺骗目的。这种方法通常用于执行危险的操作如数据操纵或其他恶意活动。
具体来说,在数据库管理中使用预设参数集(PreparedStatement)是一种更安全的方式。它可以将参数预先绑定到语句中从而避免直接暴露 SQL 命令。
在Spring Mapper文件中使用#{}会生成占位符以防止 SQL 注入的问题;而使用${}并不能完全防止 SQL 注入的风险。
(参考博客:https://www.cnblogs.com/soulaz/p/5587264.html)

十一、redirect, forward区别?

服务器按照一定逻辑返回一个状态码给浏览器,并告知浏览器转向访问该地址。这将导致浏览器地址栏显示一个新的URL。
forward 表示 server 请求资源并直接指向目标 URL。 server 会获取响应内容并将其传输给 browser,并无需关心数据来源路径。这样做不会影响到 browser 地址栏。

无法在redirect中传递数据信息,在某些情况下(如通过Forward机制)可能需要将请求头信息一并发送至目标URL中以实现跨站请求校验(Cross-Site Request Forgery protection)。此外,在特定场景下(如将请求对象路由至同一地址),可以通过两种不同的前向方式实现不同的功能需求。其中,在处理用户注销时采用的是backward URL机制,在处理登录操作时则采用的是forward URL机制,并且后者在性能上具有明显优势

十二、探讨JAVA内存模型的相关知识时,请考虑以下问题:一个单个Java对象(其属性数目为两个、其方法数量为四个)被实例化100次后,在当前占用的内存资源情况下,请问这些单个Java对象占用的内存空间数量是多少?

在Java内存空间中,默认情况下所有新创建的对象都被放置在堆区。当调用100次new命令时,在堆内存中共生成100个独立的对象实例。通常情况下,每个对象都是由其自身的属性值及其绑定的方法所组成的完整实体。若这些属性与方法被声明为静态,则它们在整个程序运行期间只会被存储一份。

探讨Hibernate的工作原理及其缓存机制的作用,在实际项目中,请阐述Hibernate是如何实现缓存功能的?

一级缓存作为Session的基本缓存,并且是内置于系统且无法被移除的功能。当一个Session执行了一个查询操作时,该操作的结果会被存储在一级缓存中。在短时间内再次执行相同的操作时,在Hibernate内部就会直接从该缓存中取出数据完成处理。

SessionFactory的缓存系统分为内置缓存与外置缓存两种类型;这种技术主要是为了实现查询结果的一次性加载与快速访问机制;当同一个sessionFactory生成的某一个session执行相同操作时,hibernate会从二级缓存中获取结果;对于更改频率较低、重要性不高以及偶尔会发生并发访问的内容,并且避免被多线程同时处理的情况;建议将其存储于二级缓存中;而对于容易频繁修改的内容、涉及财务相关的具体信息以及其他需要严格禁止出现多线程处理的情况;以及与其他系统交互涉及的相关数据,则不建议采用二级缓存在存储方式。

mybaits 一级缓存二级缓存

https://www.cnblogs.com/happyflyingpig/p/7739749.html

十四、反思讲一讲,在概念上主要涉及哪些方面?哪些地方需要进行反思?反思机制在运行时的表现如何?如何对其进行优化?能够进行解析类能力的程序被称为反射器。反射机制的作用包括:在运行时解析类的能力,在运行时访问对象(如提供一个toString方法供所有类调用),实现通用的数据操作代码(如通过Method对象),这个对象类似于C++中的指针。

反射性能优化方法主要为设置不用做安全检查。

在Spring IOC体系中核心采用的是代理模式策略,在其基础架构下建立在反射机制之上。其中反射是指一个对象照镜子(镜像自身),能够精准地反映出现有的全部属性信息,并主动获取对象名称、方法和属性信息及其实体类信息。而Spring框架的核心理念则是通过IOC(依赖注入)实现对反转管理这一设计理念的主要支撑点,则是主要依靠反向代理模式来进行操作实现的。这种设计使得框架能够将创建对象的任务委托给Spring框架来处理,并且在此过程中实现了对反转管理这一设计理念的主要支撑点,则是主要依靠反向代理模式来进行操作实现的这一特点得以体现出来。

十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些?

Hibernate与MyBatis都可以通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由 Session来开启执行事务和SQL语句。
而MyBatis的优势是MyBatis可以进行更为细致的SQL优化,可以减少查询字段,并且容易掌握。
Hibernate的优势是Dao层开发比MyBatis简单,
MyBatis需要维护sql和结果映射,数据库移植性,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL,有更好的二级缓存机制,可以使用第三方缓存,MyBatis本身提供的缓存机制不佳。

十六、了解Spring的相关知识,在项目中具体应用场景中的使用情况是什么样的?具体的操作流程又是怎样的?对于IOC和AOP的理解及其实现原理是什么?(spring知识点 https://www.ibm.com/developerworks/cn/java/wa-spring1/)

开源框架Spring自2003年左右兴起以来逐渐成为Java领域的重要开发工具,在Rod Johnson所著《 Expert One-On-One J2EE Development and Design 》一书中对其一些基本概念和架构基础进行了阐述并进行了衍生发展。它旨在解决企业级应用开发中的复杂性问题而产生的工具,在服务器端开发中展现出显著的优势与灵活性;其核心设计理念强调通过分层架构实现模块化开发从而提高系统的可维护性和扩展性;这种设计理念不仅限于服务器端开发在其他如客户端或其他业务场景中也同样适用并能带来显著的价值提升;通过控制反转模式(IoC),Spring负责管理对象创建过程进而简化了传统JavaBean式的对象生命周期管理方式;而面向切面编程(AOP)则通过实现拦截器与过滤器的方式实现了业务独立性的提升使复杂的事务管理变得简单易行。
通过控制反转模式(IoC),Spring负责管理对象创建过程进而简化了传统JavaBean式的对象生命周期管理方式;

十七、多线程协调,并发操作如何管理
多线程协调不一定意味着同时运行,而是指各程序之间的相互衔接,统一节奏的操作模式。多线程间的协调主要基于其存在的相互关联执行逻辑,因此需要对其执行顺序进行合理安排与管理

多线程并发是指多个程序模块在同一时间段内并行运行的现象。若各线程在时间上可区分类别,则可通过设置休眠时长实现同步操作;若各程序间难以单独区分时间顺序但逻辑上有先后次序时,则可采用join()方法;对于较为复杂的多线程设计问题,则必须依靠wait()和notify()等基本机制进行处理。

十八、描述struts的工作流程。

其基本流程包括Web应用程序的启动,并非仅限于简单的页面加载;在实际运行中,系统将处理来自客户端的请求请求,并根据预设规则进行数据匹配操作;最终输出相应的用户查询结果。

当Web应用程序启动时,在其生命周期开始阶段加载并初始化了ActionServlet,并使其从struct-config.xml文件读取配置信息后将其存储到各自的配置对象中。

每当ActionServlet接收一个客户请求时,在接收到该请求后会首先查找与之匹配的ActionMapping映射实例;如果找不到,则返回关于用户请求路径无效的信息。

当ActionForm实例不存在时,则生成一个新的ActionForm实例,并将客户端提交的表单数据赋值给该实例。

基于配置参数决定是否执行表单验证操作。若决定执行,则调用对应的方法进行操作;若该方法返回为空或不包含错误信息,则表示验证过程已完成并取得成功结果。

在ActionServlet中主要依据的是与ActionMapping实例所包含的映射信息相关联,请请求将该请求转发给对应的Action。当相应的Action实例不存在时,则需先创建该实例,并随后调用其execute()方法。

Action的execute()方法返回一个ActionForward对象;随后, ActionServlet会将客户的请求重定向至该对象所指定的JSP页面进行构建.

ActionForward对象指向的jsp组件生成的动态网页,返回给客户。

十九、在 Tomcat 的框架下进行 session 管理,请具体描述如何搭建一个基于 Tomcat 的服务器及其 session 机制的具体步骤。

在session启动的过程中,Servlet容器会生成一个HttpSession实例,并在特定情况下将部分HttpSession实例转移至文件系统或数据库存储位置;在必要时将这些实例加载回内存以便调用相关功能。这种设计不仅能够实现对内存资源的优化利用(即节省内存空间),而且能够确保即使Web服务器发生故障(比如重启或其他异常情况),也能通过从本地存储或者数据库恢复数据来维持服务的状态连续性(即保证应用正常运行)。

二十、关于Cache(EHCache, Memcached)
分布式内存对象缓存系统(如EHCache和Memcached)广泛应用于现代互联网系统中。通过负载均衡技术,在多台Web服务器之间共享一台 Memcache 服务器的内存资源(例如三台Web服务器)。采用键值对存储方式传递信息,并确保传输的数据能够通过序列化编码防止在机器故障时无法恢复

该技术:基于页面级缓存机制的技术(旨在最大化存储在服务器上的内容),通常会占用本地内存空间。可以选择将该技术应用于硬盘而非内存中,在此情况下,在服务器重启时可重新加载上一次持久化的数据;然而,在内存中进行缓存则不具备这一优势。通常情况下,在将该技术应用于本地存储时并无显著优势;相反,在大多数场景下直接从数据库进行读写操作更为高效。此外,请注意:Oscache支持两种不同的数据作用域——一个是基于应用层的作用域(App),另一个是基于会话层的作用域(Session)。

EhCache实现了Hibernate功能模块下的缓存服务,并支持代用元数据存储(D/A/O)以及安全认证相关的数据存储(Acegi)。此外还支持Web应用层的数据持久化以及分布式系统下的数据存储需求。在默认配置下,在没有指定自定义的配置文件的情况下系统会自动采用本地Java虚拟机主类路径中包含的 Acegi 配置文件以确保最佳运行状态。当用户在 classpath 路径下指定了 EhCache 或 Acegi 配置文件时系统将优先按照指定路径下的配置执行相关功能。如果同时指定了多个配置文件则系统将优先执行由 EhCache 定义的策略

二一、sql的优化相关问题(避免全表查询,数据量大时使用索引)

对查询优化,避免全表扫描

应尽量避免在WHERE子句中执行关于段的null检查操作,因为这可能导致引擎在遇到全表扫描时会放弃使用索引。

应尽量避免where子句中包含不等式运算符(如!=或<>),从而使得引擎能够继续利用索引加快查询速度

尽量避免where子句中出现or来连接条件。

慎用in和not in,否则导致全表扫描

where中不要用函数操作。

在 update 操作中,请确保仅修改 1 至 2 个字段。避免修改所有字段,则可能导致明显的性能问题和大量的日志记录。

对于多个大量数据(这里几百条就算大了)的表JOIN操作来说,在执行连接时必须先将这些表按页数分割后再进行连接操作。如果不采取这种方法,在执行连接操作时会导致大量的数据被一次性读取,并且会导致逻辑读数很高以及系统的性能表现不佳。

尽可能的使用 varchar/nvarchar 代替 char/nchar,节省空间,提高查询效率

执行以下查询语句:统计计数器从指定的数据表获取数据量。这种方式无条件统计整个数据表的数据量,并对业务没有实际意义。这种做法是坚决禁止的。

二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?

虽然两者都是虚拟字段但它们的本质区别在于, rownum是基于SQL查询的结果赋予每一行一个逻辑上的顺序编号而rowid则是在物理层面上存在,每当一条新记录被插入到数据库中时都会生成一个独一无二的物理存储.在查询性能方面,rownum的表现优于rowid的原因在于,使用rowid遍历的数据量更大.因此,当执行范围查询时选择基于rowid会显著提升搜索效率.此外,为了优化数据处理流程通常会将前1000条数据按时间倒序排列然后加上关键字 between rownum 和终止位置以实现快速定位功能

二三、如何分析ORACLE的执行计划?
https://blog.51cto.com/xiao1ang/1900950(如何查看执行计划,并根据执行计划优化sql)

二四、 DB中索引原理,种类,使用索引的好处和问题是什么?

原理:由于在检索磁盘时需要对数据进行对比操作,这会耗时较长且需要用到大量IO操作,因此为了提高效率和准确性,在构建数据库索引时通常会采用B树、哈希值以及bitmap 索引等技术。传统的索引方法能够迅速地实现数据查找与对比功能,其中索引存储的信息主要反映了存储位置及相关属性,从而可以直接获取数据库中对应位置字段的具体内容。

索引好处在于提升数据检索效率;特别地,在提升表间关联效率的同时,在实现数据完整性方面具有特殊重要性;此外,在降低查询时在分组及排序过程中的时间消耗上采用了优化隐藏器技术以进一步提高系统性能。

缺点:建立和管理索引需要耗费时间;建立索引必须占用一定物理存储空间;每当表中的数据被增删改时,相关的索引也需要随之动态地进行更新。

二五、JVM垃圾回收实现原理。垃圾回收的线程优先级?
JVM的堆空间中主要分为年轻代、年老代和永久代。
年轻代和年老代是存储动态产生的对象。永久代主要是存储java类信息(native对象,操作非java方法用),包括解析得到的方法属性、字段等等。永久代基本不参与垃圾回收。年轻代分为一个eden区和两个相同的survior区。刚开始创建的对象都放置在eden区。这样主要是为了将生命周期短的对象尽量留在年轻代中。当eden区申请不到空间时,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的对象,如缓存对象。具体JVM垃圾回收过程如下:

1、内存分配过程在Eden区域顺利完成。
2、创建对象时由于Eden区域已满而无法申请空间的现象会导致minorGC事件发生,并在此阶段执行eden区和survivor1的年轻垃圾回收。
3、在minorGC时,Eden不能被回收的对象被放置于空闲的survivor2区域中(这表示 Eden 区必然会被清空),而无法由GC回收的对象也会转移至 survivor1 区域。
4、处理完上述步骤后:如果发现 survivor 区域已满,则将剩余对象复制至 old 区;否则,在 GC 执行次数达到一定阈值(默认为 15 次)也需转移至 old 区域。当 old 区域再次填满时则触发 full GC 事件。

二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

JVM内存可划分为堆内存与非堆内存两种类型,在实际应用中开发人员通常会使用到的是前者;而后者则是JVM自身所专用的空间区域,在执行垃圾回收操作时不会被释放。

堆内存设置:

-Xms指定初始堆内存大小,默认值为系统物理内存的1/64;其中最小分配区域也作为初始设置;当剩余可分配内存低于40%时,则会自动增长至-Xms的最大设置上限。

-Xmx 用于指定最大堆内存容量,默认设置为物理内存的四分之一。当剩余堆内存超过70%时,系统会自动将-Xms的最小限制值减小。

非堆内存设置:

-XX:PermSize 非堆内存的初始值,默认物理内存的1/64,也是最小非堆内存。

-XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4。

查看堆大小命令为Runtime.getRuntime().maxMemory()。

二七、jvm怎样通过参数调整内存大小?

本地环境变量中JVM参数设置:

new一个JAVA_OPTS:

variable name: JAVA_OPTS

variable value: -Xms256M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M

eclipse中参数设置:在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

二八、进程与线程的区别?

线程是进程的一个部分,在进程中可被调度的对象。
区别在于:一是地址空间独立性不同——进程内核拥有独立的地址空间;而线程则共享父进程的地址空间。
二是从资源分配与管理角度来说,则进程负责自身的资源分配与管理;而同一进程中各线程共享的是该进程中所拥有的资源。
三是处理器调度的基本单元是线程。
综上所述可知,在多态并行环境下两种都可在同一时间段内并行运行。

二九、怎样避免死锁

使用事务时,尽量缩短事务idea逻辑处理过程,及早提交或回滚事务

配置死锁检测机制的有效时长设置为合理的区间,在3至10分钟之间进行调整;当时间超出限制,则放弃当前操作以防止进程长时间等待资源而被终止

优化程序,检查并避免死锁现象出现。

对所有的脚本和sp(Structured Programming 结构化编程)都要仔细测试。

所有的sp(Structured Programming 结构化编程)都要有错误处理。

一般不要修改sql事务的默认级别。不推荐强行加锁。

三十、垃圾回收算法使用的产品、场景

标记-清除算法:在标记期间识别并进行标记,在清除期间,则会回收相应的对象(eg :fullgc 清理老年代区时 根据gc年龄清除)。

复制算法采用将内存划分为等量两部分的方式,在每次只占用其中之一的情况下,在垃圾回收阶段将存活对象转移至另一部分内存区域,并随后释放该区域的内存空间。在此过程中需注意比例设置为8:1(例如,在执行年轻代回收操作时, 将eden区域以及survivor1区域内存在的存活对象转移至 survivor2区域, 并后释放edn区域与 survivor 区域的所有内存占用)。其中 Eden:survivor 区域总容量应维持8:1的比例关系

标记整理算法的作用是将存活的对象转移至内存的一端,并直接释放超出边界外的内存区域

分生老死回收机制:该方法通过根据对象的存活时间将内存划分为新生期和成熟期,并基于各阶段对象的生命特征选择相应的GC方案。其中新生期采用标记-复制方案以实现对象快速回收的目标;成熟期则采用更为稳健的标记-整理策略以减少内存泄漏的可能性。

三一、实际项目中JVM调优?

JVM启动参数设置主要涉及优化各代内存分配比例以及选择合适的垃圾回收算法。该参数组合通过调整堆中对象创建与垃圾回收阶段的比例关系来提升整体性能指标。具体而言,在该机制下"吞"指堆中对象的创建过程,在"吐"指gc阶段的垃圾对象回收。

2、改进程序逻辑算法,提高性能。

3、量身定制的线程池实现优化用户体验的性能瓶颈。例如,在配置时可指定最小和最大线程数参数

4、连接池

三二、jdk并发包的集合介绍

Map 并发包 实现了一个核心数据结构 基于 Concurrency 模块 该模块实现了 ConcurrencyMap 接口 其 put 操作是通过计算哈希值来定位对应的段对象 一旦定位到该段对象 则会调用其内部的 put 方法执行操作 段内处理时会先加锁 以确保数据的一致性 并判断当前数组大小 是否需要扩展 最终确定放置位置后完成相关操作

为列表添加并发处理能力后发现客户在高负载场景中倾向于采用CopyOnWriteArrayList替代传统的ArrayList数据结构插入操作通过复制操作和锁定机制实现以提高数据一致性保障系统稳定性经过测试在并行操作中CopyOnWriteArrayList的表现略胜一筹

在并行场景中,并行情况下使用CopyOnWriteSet和CopyOnWriteArrayList时,在底层实现上具有相似性。具体而言,在添加元素的过程中都会进行唯一性检查。如果源数组中已存在重复项,则不会进行新增操作。

支持多线程操作的并行队列(称为ArrayBlockingQueue)基于数组实现,并对入队与出队操作进行了锁机制处理。

在并发编程中,“Atomic系列类”,例如“AtomicInteger类”,通常用于执行计数器操作时,在方法层面进行加锁以确保线程安全。“有了”这些提供原子性保障的并发包中的原子系列类后,“我们就能够直接使用它们了。”

三条、多线程之间的交互机制
参考资料
在线条之间如何实现高效的通信? haps Jin’s 博客文章
此外,在Java编程中常常会遇到的各种锁类型详解: Wenxu 的博客文章
深入解析Java中的锁类型: Qin Fengshì 的博客

主要包括互斥锁、条件变量、读写锁和线程信号灯。

互斥锁采用排他机制来防止数据被多个用户同时修改。在互斥锁的设计中通常有两种状态:0代表未锁定状态而1代表已锁定状态。具体来说,在申请 lock 时会立即占用该 lock 并在使用该 lock 期间阻止其他用户获取它。一旦所有相关操作完成并确认没有冲突则会实现对所占有的 lock 的释放过程。

该通信机制基于以下核心原理:当条件变量出现时,则能有效弥补传统信号量方法在解决某些同步难题上的不足;某些问题仅凭传统的信号量方法难以完美解决;需要注意的是,在实际应用中应避免将信号量孤立使用;而应在特定场景下将其与信号量结合使用才能达到预期效果

主要是在数据的read与write过程中。原则是:若其它line程序列可read,则这些line程序列可执行read operation而不被禁止进行相应的write operation;若有其它line程序列欲申请perform write operation,则这些其它line程序列将被阻止进行read和write的操作。

对于一个特定的系统来说,在实现多态通信时所采用的机制被称为"线程信号"。通过特定的机制或协议传递信息的方式称为"发送"操作;每个进程都有独立维护的一个阻塞集合用于管理其等待状态;无论处于哪个运行状态,在处理同一个事件时的行为完全一致。

三四、介绍threadlocal

通常称为 thread-local variables 或 thread-local storage 也被称为 local variables 在特定上下文中。ThreadLocal 结构通过在每个线程内部创建独立副本的方式确保每个线程都能访问自己的数据。但是这种方式可能会导致内存占用较高

ThreadLocal类的主要功能包括get()方法用于获取本线程存储的变量副本;set()方法用于将本线程存储的变量值进行更新;remove()方法则用于清除本线程存储的变量副本;而initialValue()通常用于在应用初始化阶段设置初始值,并采用延迟加载策略以减少内存占用;常见的应用领域包括但不限于数据库连接管理和Session实例控制等。

三五、jdbc的操作过程

调用所需的数据库驱动包;建立与数据库的连接;通过SQL语句执行数据库操作;释放与数据库相关的连接资源

三六、HTTP1.1的新特性

支持持续性连接,在建立一个TCP连接后,发起请求数组并接收相应数据;随后立即发送下一个请求数组以获取更多响应信息。为了优化资源利用,在将建立和释放TCP连接所需的资源开销分散至多个请求数组中时(即对每个后续请求数组而言),相比单纯依赖TCP带来的额外资源消耗已显著降低。此外还可以按流水线方式发起请求数组以进一步提升处理效率。

三七、异常处理,包含了什么

参考:http://lavasoft.blog.51cto.com/62575/18920/

三八、堆排序与快速排序

View Code

View Code

堆排序是一种渐进最优的比较排序算法,在理论下界的基础上实现了最佳性能表现;然而,在快速排序中存在一定的概率会导致最差情况划分, 这种情况下其可能导致的时间复杂度达到O(n²)。该算法在进行元素比较时主要集中在非相邻元素之间, 这种特性会对缓存系统造成不利影响;值得注意的是, 数学上的复杂度评估并不直接等同于实际运行中的计算开销

三九、Collection有哪些类

集合、列表与映射是Java程序中常用的容器接口类型。其中包含有顺序要求的是映射相关的接口与容器类型

四十、Hashcode总为1会怎样,如何解决hash冲突

当所有对象的Hashcode返回值均为1时,则会导致每个对象均出现hash冲突,并从而使系统性能下降

解决hash冲突:

线性再散列技术是一种解决冲突问题的有效方法,在插入新元素时遇到碰撞情况会直接进行处理。具体而言,在发生冲突的情况下算法会依次扫描哈希表直至寻找到第一个空闲位置并将该元素放置在那里以避免冲突带来的效率损失。而在查询操作过程中系统首先计算目标键对应的哈希地址若未发现匹配项则会继续扫描整个哈希表直到满足以下任一条件:一发现目标键对应的值;二遇到一个空闲位置从而确认目标键不在哈希表中;三完成对所有单元格的扫描最终判断目标键不在当前已满载的哈希表中

非线性和线性再散列法均源自冲突位置,并依次以固定步长进行遍历以寻找下一个可用槽的位置。如前所述,则容易导致冲突聚集现象。而非线性再散列法则会重新计算哈希值并转移到完全不同的区域。

开放地址法中通常将哈希表视为一个由链表组成的数组;每个槽要么为空,要么指向该槽对应的哈希值所指的链表节点。

四一、如何用两个队列实现栈

即可以将A队列作为栈push,B队列作为栈pop。量队列数据相同。

四二、Object的通用方法

公共接口包含有equals(),finalize(),toString()等常用功能;其中,other native methods包括public interface中的hashcode(),registerNatives(),getClass(),clone(),notify(),notifyAll()以及wait()。

四三、Java中如何实现多态

多态作为面向对象编程体系结构中的关键特征之一,在程序设计中扮演着重要角色。其核心作用在于实现对象之间的动态关联。确定的状态仅由运行时环境决定而非由编译阶段预先确定。这种特性有助于显著提升系统架构的灵活性与可扩展性。

多态的三个必要条件:有继承、有方法重写、父类引用指向子类对象。

引用变量有两种类型的划分:一种是在编译阶段根据声明的变量类型来确定;另一种则是在运行阶段基于实际关联的对象来判断。

View Code

View Code

多态内存:

四四、Java内存泄漏

内存泄漏主要有两种常见情况:在C++/C语言中,在堆中为变量分配了动态内存空间后未被正确地回收或释放的情况下,会导致所有能够访问这些已分配但未回收的内存对象都被移除。例如,在指针重新赋值时可能会发生这种情况。

内 存 泄 出 一 般 情况 下 有 两 种 情况 : C++ / C 语 言 中 , 在 堆 中 分 配 的 内 存 , 没 有 将 其 释 放 掉 就 删 除 了 所 有 能 访 问 到 这 块 内 存 的 方 式 全 部 删 除 。 ( 如 指 针 再 次 赋 值)

另一种情况是当内存对象不再需要使用时仍会占用这块内存空间及其引用关系(引用),因为Java采用了垃圾回收机制这种情形一般被称为Java中的内存泄漏

就C/C++内存泄漏而言,Java虽然不会造成太大的破坏,仅有极个别案例会导致应用程序崩溃.而在移动设备环境下由于其对资源(如内存和CPU)的需求更为严格,Java一旦出现溢出问题将会导致应用运行效率下降,并过度消耗不必要的内存空间.严重时可能导致系统抛出OutOfMemoryError从而崩溃.

当处理仅包含简单数据结构时,在这种情况下(即Java内存泄漏现象中),其表现形式是该内存对象在其生命周期超出了程序对其所需的时间范围内的状态。(这现象被称为对象游离(或称作内存泄漏的一种形式)。)

内存泄漏的具体情形包括:Java程序中堆空间溢出、虚拟机栈以及本地方法调用栈发生溢出、在方法区以及运行时常量池中出现溢出现象、本机应用直接导致内存溢出的情况

四五、final字段总结

final类不能被继承,其中的方法也是默认final类型,没有子类。

final方法不能被子类覆盖,但可以继承

final变量表示常量,只能被赋值一次赋值后不改变

final不能用于构造方法

四六、override(重写)和overload(重载)区别

当使用 override 机制时:当一个子类继承自父类时(即通过 class inheritance 实现),该机制允许子类创建一组功能一致的方法(即具有相同名称、参数数量以及输入输出数据类型的函数),这些方法在被调用时会自动由子类执行(而不是由父类执行),从而使得父类的功能被覆盖或隐藏。

在类的设计中, 通过多态性来体现功能实现, 虽然函数名称一致但参数的数量, 类型以及排列顺序等方面均存在差异

四七、static关键字?
static修饰使用的变量
静态变量被称为静态变量,在内存中只有一个副本,在类初次加载时会被初始化;而非静态变量是在对象创建时被初始化并拥有多个副本。
static修饰代码块
static关键字的一个关键作用是用于创建静态代码块以提高程序性能;这些块按照顺序执行一次即可完成功能。
static修饰方法
静止的方法通常称为静态方法;它们不需要依赖任何对象即可访问;因此无法访问非静止成员函数或成员字段;因为这些成员只能由具体的对象调用才能访问到。
static修饰类
使用 static 修饰符来引用成员是允许的;特别地,在 Java 中 static 通常用于引用成员函数或字段;而内部类则需要特别注意是否使用 static 标识符以避免与外部同名冲突的问题。

四八、JVM的生命周期:

  1. 生成。每当运行一个Java程序时,在内存中会生成一个JVM实例,并且任何具有public static void main(String[] args)函数的class都可以作为JVM实例运行的基础程序。
  2. 启动过程。主要执行主 thread(即该程序的初始 thread)开始运行;其余 thread则由该 thread发起启动。
  3. 结束过程。只有在所有非守护 thread完成退出后,JVM才会从内存中释放;如果安全机制允许,也可以通过调用Runtime类或者调用System.exit()方法来实现退出功能

全部评论 (0)

还没有任何评论哟~