新闻资讯

    各位在面试时,必然会遇到各位的技术问题。这次针对Java后端开发,以下这篇文章罗列了各大公司技术面试官可能会提及的问题,并做出了解答。若觉得不错,希望分享给更多求职的小伙伴哦~

    问题一

    (线程变量副本)

    实现内存共享,为每个线程维护一个本地变量。

    采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

    类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。

    在中发挥着巨大的作用,在管理作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。

    中绝大部分Bean都可以声明成作用域,采用进行封装,因此有状态的Bean就能够以的方式在多线程中正常工作了。

    问题二

    Java内存模型

    程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。

    Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。

    本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的方法服务。

    Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。

    方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。

    运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。

    问题三

    java GC是在什么时候

    对什么东西

    做了什么事情?

    新生代有一个Eden区和两个区,首先将对象放入Eden区,如果空间不足就向其中的一个区上放,如果仍然放不下就会引发一次发生在新生代的minor GC,将存活的对象放入另一个区中,然后清空Eden和之前的那个区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。

    大对象以及长期存活的对象直接进入老年区。

    钢绳计数跳绳器_程序计数器里放的是什么_tcl32液晶电视d59 储里器是几何

    当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次Full GC以尽可能地获得老年区的空间。

    新生代:复制清理;

    老年代:标记-清除和标记-压缩算法;

    永久代:存放Java中的类和加载类的类加载器本身。

    虚拟机栈中的引用的对象

    方法区中静态属性引用的对象,常量引用的对象

    本地方法栈中JNI(即一般说的方法)引用的对象。

    问题四

    与Lock都是可重入锁,同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁。

    是悲观锁机制,独占锁。而Locks.是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

    某个线程在等待一个锁的控制权的这段时间需要中断

    需要分开处理一些wait-,里面的应用,能够控制哪个线程,锁可以绑定多个条件。

    具有公平锁功能,每个到来的线程都将排队等候。

    问题五

    是线程安全的,每次操作字符串,会生成一个新的对象,而不会;是非线程安全的

    问题六

    机制是java集合()中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

    例如:当某一个线程A通过去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出异常,产生fail-fast事件

    问题七

    -:如果两个操作之间具有- 关系,那么前一个操作的结果就会对后面一个操作可见。

    tcl32液晶电视d59 储里器是几何_钢绳计数跳绳器_程序计数器里放的是什么

    程序顺序规则:一个线程中的每个操作,- 于该线程中的任意后续操作。

    监视器锁规则:对一个监视器锁的解锁,- 于随后对这个监视器锁的加锁。

    变量规则:对一个域的写,- 于任意后续对这个域的读。

    传递性:如果A - B,且B - C,那么A - C。

    线程启动规则:对象的start()方法- 于此线程的每一个动作。

    问题八

    粒度不同,前者针对变量 ,后者锁对象和类

    syn阻塞,线程不阻塞

    syn保证三大特性,不保证原子性

    syn编译器优化,不优化 具备两种特性:

    保证此变量对所有线程的可见性,指一条线程修改了这个变量的值,新值对于其他线程来说是可见的,但并不是多线程安全的。

    禁止指令重排序优化。

    当写一个变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。

    当读一个变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。

    问题九

    CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败程序计数器里放的是什么,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

    问题十

    在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程

    降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

    提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

    钢绳计数跳绳器_程序计数器里放的是什么_tcl32液晶电视d59 储里器是几何

    提高线程的可管理性。

    是主要的实现类,其中常用的有 .(),(),(),ol()。

    问题十一

    装载:将Java二进制代码导入jvm中,生成Class文件。

    连接:

    a)校验:检查载入Class文件数据的正确性

    b)准备:给类的静态变量分配存储空间

    c)解析:将符号引用转成直接引用

    初始化:对类的静态变量程序计数器里放的是什么,静态方法和静态代码块执行初始化工作。

    问题十二

    缓存:

    数据结构:key,value对

    使用方法:get,put等方法

    问题十三

    —字符串(key-value 类型)

    Hash—字典() Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值

    List—列表 实现消息队列

    Set—集合 利用唯一性

    Set—有序集合 可以进行排序 可以实现数据持久化

    问题十四

    程序计数器里放的是什么_钢绳计数跳绳器_tcl32液晶电视d59 储里器是几何

    B+,B-,全文索引

    Mysql的索引是一个数据结构,旨在使数据库高效的查找数据。

    常用的数据结构是B+Tree,每个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子节点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能。

    经常出现在group by,order by和关键字后面的字段

    经常与其他表进行连接的表,在连接字段上应该建立索引

    经常出现在Where子句中的字段

    经常出现用作查询选择的字段

    问题十五

    支持三种依赖注入方式,分别是属性(方法)注入,构造注入和接口注入。

    在中,那些组成应用的主体及由 IOC容器所管理的对象被称之为Bean。

    的IOC容器通过反射的机制实例化Bean并建立Bean之间的依赖关系。

    简单地讲,Bean就是由 IOC容器初始化、装配及被管理的对象。

    获取Bean对象的过程,首先通过加载配置文件并启动IOC容器,然后通过方法获取bean对象,就可以调用他的方法。

    : IOC容器中只有一个共享的Bean实例,一般都是作用域。

    :每一个请求,会产生一个新的Bean实例。

    :每一次http请求会产生一个新的Bean实例。

    问题十六

    业务类只需要关注业务逻辑本身,保证了业务类的重用性。

    代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,代理对象可以在调用目标对象相应方法前后加上其他业务处理逻辑。

    缺点:一个代理类只能代理一个业务类。如果业务类增加方法时,相应的代理类也要增加方法。

    程序计数器里放的是什么_tcl32液晶电视d59 储里器是几何_钢绳计数跳绳器

    Java动态代理是写一个类实现接口,重写方法,在方法可以进行增强处理的逻辑的编写,这个公共代理类在运行的时候才能明确自己要代理的对象,同时可以实现该被代理类的方法的实现,然后在实现类方法的时候可以进行增强处理。

    实际上:代理对象的方法 = 增强处理 + 被代理对象的方法

    JDK动态代理只能针对实现了接口的类生成代理(实例化一个类)。此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑

    CGLIB是针对类实现代理,主要是对指定的类生成一个子类(没有实例化一个类),覆盖其中的方法 。

    性能检测,访问控制,日志管理,事务等。

    默认的策略是如果目标类实现接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理

    问题十七

    客户端请求提交到

    由控制器查询,找到并分发到指定的中。

    调用业务逻辑处理后,返回

    查询一个或多个视图解析器,找到指定的视图

    视图负责将结果显示到客户端

    问题十八

    DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如、css、图片等) –> 浏览器对页面进行渲染呈现给用户

    设计一个叫“中间层”的一个逻辑层,在这个层,将数据库的海量数据抓出来,做成缓存,运行在服务器的内存中,同理,当有新的数据到来,也先做成缓存,再想办法,持久化到数据库中,这是一个简单的思路。主要的步骤是负载均衡,将不同用户的请求分发到不同的处理节点上,然后先存入缓存,定时向主数据库更新数据。读写的过程采用类似乐观锁的机制,可以一直读(在写数据的时候也可以),但是每次读的时候会有个版本的标记,如果本次读的版本低于缓存的版本,会重新读数据,这样的情况并不多,可以忍受。

    问题十九

    可以让服务端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些,如果很多,则无形的增加了客户端与服务端的数据传输量。

    而则很好地解决了这个问题,同一个客户端每次和服务端交互时,将数据存储通过到服务端,不需要每次都传回所有的值,而是传回一个ID,每个客户端第一次访问服务器生成的唯一的ID,客户端只要传回这个ID就行了,这个ID通常为NAME为的一个。这样服务端就可以通过这个ID,来将存储到服务端的KV值取出了。

    和的超时问题,的安全问题

    问题二十

    配置服务器,集群管理服务器可以统一管理所有服务器的配置文件

    共享这些存储在一个分布式缓存中,可以随时写入和读取,而且性能要很好,如,Tair。

网站首页   |    关于我们   |    公司新闻   |    产品方案   |    用户案例   |    售后服务   |    合作伙伴   |    人才招聘   |   

地址:北京市海淀区    电话:010-     邮箱:@126.com

备案号:冀ICP备2024067069号-3 北京科技有限公司版权所有