热门关键词:  爆珠  细支  细支烟  万宝路  烟草  黑魔鬼香烟
您的位置: 主页 > 新闻中心 > 经验网 > 应届毕业生不香吗?三年经验,高级开发工程师

应届毕业生不香吗?三年经验,高级开发工程师

作者:a123456时间:2021-04-11 20:59 次浏览

最近一直忙于面试(之前的面试给老板们留下了很深的印象,所以后来就做了),有各种Java经验的人或多或少都有不同的感受。

没有,最近有个三年经验的弟弟给我留下了深刻的印象。他采访了我们的高级开发工程师。按照惯例,我们先看他的简历。他的简历还是很优秀的,多多少少涉及到各种技术。

Spring框架中的Bean是线程安全的吗?如果线程不安全,怎么办?

堆里分区:伊甸园,生存(从到),老年,各自的特点。

开场还是简单的介绍。在介绍中他提到了一些不错的技术,比如Spring,JVM,MQ,所以我的问题偏向于他的好的部分。(PS:所以面试的时候介绍自己的时候,介绍自己的一些好的部分会给后续的面试带来很大的优势。)

我:刚才你自我介绍的时候说对Spring有一定的了解,那么能否简单描述一下Spring的AOP和IOC?

IOC是控制反转,即创建对象的控制权转移到Spring框架进行管理,Spring根据配置文件创建实例,管理实例间的依赖关系。对象之间的松散耦合也有利于功能的重用。DI依赖注入和控制反转是从不同角度对同一个概念的描述,即应用依赖IoC容器在运行时动态注入对象所需的外部依赖。

最直观的表现就是,在过去,创造对象的主动性和机会都是自己控制的。国际奥委会使物体的创造不必去新的,可以由春天自动产生。利用java的反射机制,在运行时根据配置文件动态创建和管理对象,并调用对象的方法。

Spring中注入IOC的方式有三种:构造函数注入、setter方法注入和注释注入。

AOP,俗称面向方面,作为面向对象的补充,用于将与业务无关但影响多个对象的公共行为和逻辑提取打包成一个可重用的模块。这个模块被命名为“Aspect”,减少了系统中的重复代码,减少了模块之间的耦合,提高了系统的可维护性。它可以用于授权认证、日志记录和事务处理。

AOP实现的关键在于代理模式,代理模式主要分为静态代理和动态代理。静态代理的代表是AspectJ;动态代理用SpringAOP表示。

AspectJ是静态代理,也叫编译时增强。AOP框架会在编译阶段生成AOP代理类,并将AspectJ (facets)编织成Java字节码,这是运行时增强的AOP对象。

通知后:连接点退出时执行的通知(无论是正常返回还是异常退出)。

AroundAdvice:围绕连接点的通知,这是最强大的通知类型。环绕通知可以在方法调用前后完成自定义行为。它还可以选择是继续执行连接点,还是直接返回自己的返回值,或者抛出异常结束执行。

AfterReturningAdvice通知:连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)

事后通知:当方法抛出异常并退出时执行的通知

我:Spring框架中的Bean是线程安全的吗?如果线程不安全,怎么办?

Spring容器本身并没有为bean提供线程安全策略,所以可以说Spring容器本身的bean不具备线程安全特性,但是具体情况要结合bean的范围来讨论。

(1)对于原型范围内的bean,每次都会创建一个新的对象,即线程之间没有bean共享,所以没有连线)

所有线程共享单个实例的Bean,因此存在线程安全问题。但是,如果单例Bean是一个无状态Bean,也就是说,线程中的操作除了对Bean成员进行查询之外,不会执行其他操作,那么单例Bean就是线程安全的。比如Controller类、Service类、Dao,这些Bean大多是无状态的,只关注方法本身。

为每个线程提供独立的变量副本,不同的线程只操作自己线程的副本变量。ThreadLocal和线程同步机制是为了解决多线程中同一变量的访问冲突而设计的。同步机制采用“时间换空间”的方法,只提供一个变量。不同的线程在访问之前需要获得锁,而没有锁的线程需要排队。而ThreadLocal采用的是“空间换时间”的方式。ThreadLocal将为每个线程提供一个独立的变量副本,从而隔离多个线程的数据访问冲突。因为每个线程都有自己的变量副本,所以不需要同步变量。

我知道你在Spring的水平,我想你也知道写JVM的程度,所以:解释Java堆空间和GC?

当通过一个Java命令启动一个Java进程时,会为它分配内存。部分内存用于创建堆空间,在程序中创建对象时,从该空间分配内存。

而方法区,初始化的对象放在堆里,引用放在栈里,类信息常量池(静态常量和静态变量)放在方法区。

它主要存储类信息、常量池(静态常量和静态变量)、编译代码(字节码)等数据

:初始化的对象、成员变量(非静态变量)、所有对象实例和数组都应该在堆上分配

堆栈的结构由堆栈框架组成。调用方法时,会压入一个框架。该框架存储局部变量表、操作数堆栈、方法出口和其他信息。局部变量表存储八种基本类型加上一种应用程序类型,所以它仍然是一个指向地址的指针

说说堆里的分区:伊甸园,生存(从到),老年,各自的特点。

(java8取消永久生成,采用Metaspace)。新一代包括伊甸园幸存者区,分为从区和到区。当内存被回收时,如果使用复制算法,幸存的对象将在一次或多次垃圾回收后被移动到旧区域。当JVM内存不足时,会触发FullGC。清理JVM的旧区域当新区域满了,就会触发YGC。首先,把幸存的物体放在一个生存区,然后清理垃圾。因为如果只清理需要删除的对象,会导致内存碎片,所以伊甸园一般都是清理彻底,然后对内存进行排序。然后在下一次GC时,使用下一个Survive,回收。如果有特别大的对象,新生代放不下,就用老年的保障,直接放入老年。因为JVM认为大对象生存时间一般比较长。

:表示如果这个对象在某个地方被引用,则为1,如果无效,则为0,则回收,但是JVM不使用这个方法,因为无法判断相互循环引用的情况(A指B,B指A)

:通过GCROOT的一个对象(方法区静态变量引用的对象等)来判断。-静态变量),如果一个链可以到达GCROOT,就意味着如果不能到达GCROOT就可以回收。

,这意味着在多台机器上启动多个RabbitMQ实例,每台机器一个。但是您创建的队列将只放在一个RabbitMQ实例上,但是每个实例都会同步队列的元数据。事实上,当您使用时,如果您连接到另一个实例,该实例将从队列所在的实例中提取数据。这个方法真的很麻烦,不太好。如果不是分布式的,只是一个普通的集群。因为这将导致您一次随机连接一个实例,然后提取数据,或者固定连接队列所在的实例来使用数据。前者有数据拉取的开销,后者导致单个实例的性能瓶颈。此外,如果放置队列的实例发生故障,将导致其他实例无法从该实例中拉出。如果打开消息持久化,让RabbitMQ在地面存储消息,消息不一定会丢失。只有当此实例恢复后,您才能继续从此队列中提取数据。

指定时,可以要求数据同步到所有节点或指定数量的节点。再次创建队列时,应用此策略将自动将数据同步到其他节点。

他给我留下了深刻的印象,因为他的回答非常有条理,几乎每一个技术点都能在我想要的点上得到很好、准确的回答,甚至有所拓展,所以我对他的面试评价很高。

其实这些问题往往是在1-5年的经验中问出来的。稍微想一想,几乎每个人都或多或少可以回答一下,那么看完有什么新收获吗?面试的时候不要慌张。开场介绍很重要。注意引导面试官问你,而不是主动要求他提问,做好细节的充分准备。

返回列表 本文标签: 经验网
XML地图友情链接:火锅底料苗苗鱼