2022腾讯面试题

编程知识 更新时间:2023-05-03 03:26:12

2022 【京东】面试真题 

1、哪些况下的对象会被圾回收机制处理 

利用可达性分析算法虚拟机会将一些对象定义GCRootsGCRoots出发沿着引用链 向下寻找,如果某个对象不能通GCRoots寻找到,虚拟机就认为该对象可以被回收掉。  

  哪些对象可以被看做GCRoots 

 1)虚拟机栈(栈帧的本地变量表)中引用的对象   2)方法区中的类静属性引用的对象,常量引用的对象 

 3)本地方法栈JNI(Native方法)引用的对象;  

  对象不可达,一定会被垃圾收集器回收么?  

即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象是否有必要执finalize()方法,对象必须重finalize()方法且没有被运行过。2)若有必要执行,会把对象放到一个 队列中,JVM会开一线程去回收它们,这是对象最后一次可以逃逸清理的机会  

2、讲一常见编码方式 

编码的意义:计算机中存储的最小单元是一个字节8bit,所能表的字符范围255 而人类要表示的符号太多,无法用一个字节来完全表示,固需要将符号编码,将各种语言 译成计算机能懂的语言。  

  ASCII码:总128个,用一个字节的7位表示,031控制字如换回车删除等; 32~126是打印字符可通过键盘输入并显示出来  

  ISO-8859-1,用来扩ASCII编码,256个字符,涵盖了大多数西欧语言字符。  

  GB2312:双字节编码总编码范围A1-A7,A1-A9是符号区,包682个字符,B0-B7  汉字区,包6763个汉字; 

  GBK为了扩GB2312,加入了更多的汉字,编码范围8140~FEFE23940个码 位,能 21003汉字。  

  UTF-16: ISO试图想建一个全新的超语言字,世界上所有语言都可通过这本字典 Unicode来相互翻译UTF-16定义Unicode字符在计算机存取方法,用两个字 节来表 Unicode化格式。不论什么字符都可用两字节表示,16bit,固UTF- 16 

  UTF-8UTF-16统一采用两字节表示一个字符,但有些字符只用一个字节就可表示,浪  费存储空间,UTF-8采用一种变长技术,每个编码区域有不同的字码长度。 不同类型      1~6个字节组成。  

3utf-8 中文占个字int 型几字节 

utf-8是一种变长编码技术,utf-8编码中的中文占用的字节不确定,可2个、3个、4个,int4个字节。  

4、静态理和动态代理的别,什么场景使 

代理是一种常用的设计模式,目的是:为其他对象提供一个代理以控制对某个对象的访问 将两个类的关系解耦。代理类和委托类都要实现相同的接口,因为代理真正调用的是委托 的方法。  

 区别: 

 

静态代理:由程序员创建或是由特定工具生成,在代码编译时就确定了被代理的类是 

个是静态代理。静态代理通常只代理一个类;  

  动态代理:在代码运行期间,运用反射机制动态创建生成动态代理代理的是一个接口  的多个实现类;  

 实现步骤: 
a.InvocationHandler接口创建自己的调用处理器 
b.Proxy类提ClassLoader和代理接类型数组创建动态代理类 c.利用反射机制得到动态代理类的构造函数; 

d.利用动态代理类的构造函数创建动态代理类对象  
 使用场景:Retrofit直接调用接口的方法;SpringAOP机制  

5、简述 Java 异常体 

JavaThrowable所有异常和错误的超类,两个直接子类Error(错误)Exception(异常):  

  Error是程序无法处理的错误,JVM和抛出,OOMThreadDeath等。这些 异常 发生时,JVM般会选择终止程序。  

  Exception是程序本可以处理的异常,又分为运行时异(RuntimeException)(也叫 Checked Eception)      (    Unchecked Exception)       NullPointerException\IndexOutOfBoundsException等,这些异常一般是 由程序逻辑错误引起 的,应尽可能避免。非运行时异常有
IOException\SQLException\FileNotFoundException 由用自定义Exception 异常等。  

6、谈谈对解析与分派的识。 

解析指方法在运行前,即编译期间就可知的,有一个确定的版本,运行期间也不会改变。解析是静态的,在类加载的解析阶段就可将符号引用转变成直接引用  

 分派可分为静态分派和动态分派,重载属于静态分派,覆盖属于动态分派。静态分派是指在重载时通过参数的静态类型而非实际类型作为判断依据,在编译阶段,编译器可根据参数的静态类型决定使用哪一个重载版本。动态分派则需要根据实际类型来调用相应的方法  

7、修改 A  equals 的签,那么使 HashMap 放这

例的时,会 equals 方法 

会调用对象对象equals方法。 

 “==”如果是基本类型的话就是看他们的数据值是否相等就可以 如果是引用类型的话,比较的是栈内存局部变量表中指向堆内存中的指针的值是否相等 equals”如果对象的equals方法没有重写的话,equals方法“==”是同一种hashcod是返回对象实内存地址hash映射。 论上所有对象hash映射都是不相同的。 

8Java 态的机是什 

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时不确定,在运行期间才确定,一个引用变量到底会指向哪个类的实例。这样就可以不 修改源程序,就可以让引用变量绑定到各种不同的类实现上。Java实现多态有三个必要条件: 继承、重定、向上转型,在多态中需要将子类的引用赋值给父类对象,只有这样该引用才 够具备调用父类方法和子类的方法。 

9、如何一个 Java 象序列件里 

ObjectOutputStream.writeObject()负责将指定的流写入,ObjectInputStream.readObject()从指 定流读取序列化数据  

 //  

try { 
 ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/student.txt")); 

 os.writeObject(studentList);

 os.close(); 

 } catch (FileNotFoundExceptione) {

 e.printStackTrace(); 

 } catch (IOExceptione) { 

 e.printStackTrace(); 

 } 

10、说说 Java 反射理解 

在运行状态中,对任意一个类,都能知道这个类的所有属性和方法,对任意一个对象,都 调用它的任意一个方法和属性。这种能动态获取信息及动态调用对象方法的功能称java语言的反射机制。  

 反射的作用:开发过程中,经常会遇到某个类的某个成员变量、方法或属性是私有的,或只对系统应用开放,这里就可以利java的反射机制通过反射来获取所需的私有成员或是方法。  

 

 

获取类Class对象实Classclz=Class.forName("com.zhenai.api.Apple");  

Class对象实例获Constructor Constructor appConstructor =

clz.getConstructor();  

  使Constructor  newInstance        Object appleObj =  appConstructor.newInstance();  

  获取方法Method对象
MethodsetPriceMethod=clz.getMethod("setPrice",int.class);  

  invoke方法调用方setPriceMethod.invoke(appleObj,14);  

  getFields()可以获Class类的属性,但无法获取私有属性,而
getDeclaredFields() 以获取到包括私有属性在内的所有属性。带Declared修饰的方 法可以反射到私有的方法, Declared饰的只能用来反射公有的方法,其他如 Annotation\Field\Constructor也是如此。  

11、说说 Java 注解理解 

注解是通过@interface关键字来进行定义的,形式和接口差不多,只是前面多了一@   public@interfaceTestAnnotation{  

 }  
 使用时@TestAnnotation来引用,要使注能正常工作,还需要使用元注解,它是可以注解到注解上的注解。元标签有@Retention@Documented@Target@Inherited@Repeatable五种。 

 @Retention说明解的存活时间,取值RetentionPolicy.SOURCE注解只在源阶段保留,在编译器进行编译时被丢弃;RetentionPolicy.CLASS注解保留到编译进行的时候,并不会被加载JVMRetentionPolicy.RUNTIME可以留到程运行的时候,它会被加载进入JVM中,所在程序运行时可以获取到它们。  

 @Documented中的元素包含javadoc中去。 

 @Target限定注解应用场景ElementType.FIELD给属性进注解;
ElementType.LOCAL_VARIABLE可以给局变量进行注解ElementType.METHOD可以给方法进行注解;ElementType.PACKAGE可以给一个包进行注ElementType.TYPE可以给一个类型进行注解,如类、接口、枚举。 

 @Inherited若一个类被@Inherited过的注解进行注解,它的子类没有被任何注解应用 的话,该子类就可继承超类的注解; 

 注解的作用:  

   提供信息给编译器:编译器可利用注解来探测错误和警告信  

   编译阶段:软件工具可以利用注解信息来生成代码、html文档做其它相应处理  

   运行阶段:程序运行时可利用注解提取代码  

注解是通过反射获取的,可以通Class对象isAnnotationPresent()方法判断它是否用了某个注解,再通getAnnotation()方法获Annotation  

12、说一泛型理,并例说明。 

泛型就是将类型变成参数传入,使得可以使用的类型多样化,从而实现解耦Java泛型是在Java1.5以后出现的为保持对以前版本的兼容,使用了擦除的方法实现泛型。擦除是指 一定程度无视类型参T,直接T所在的类开始向T的父类去擦除,如调用泛型方法 传入类型参T进入方法内部,若没在声明时做类似
publicTmethodName(TextendsFathert){}Java就进行了向上类型的擦除,直接把参tObject类来处,而不是传进去T 即在有泛型的任何类和方法内部,它都无法知道自己的泛型参数,擦除和转型都是在边界上发生,即传进去的参在进入类或方法时被擦除掉,但传出来的时候又被转成了我们设置T。在泛型类或方法内,任何涉及到具体类型(即擦除后的类型的子类)操作都不能进行,newT(),或T.play()play为某子类的方法而不是擦除后的类的方法)。 

13、谈谈 Java  String 的了 

  StringfinalString类不能被承,它的成员方法也都默认final方法。 String对象一旦创建固定不变了,String对象的任何改变都不影响到原对象相关 的任何改变 操作都会生成新String  

  String类是通char数组来保存字符串的Stringequals进行了重定,比较的  值相等。  

 String a="test";String b="test";String c=newString("test");  
 ab和字面上test都是指JVM字符常量池中"test"对象,他们指向同一个对象。new关键字一定产生一个对test对象存储在堆中。所newString("test")产生了两个对象,保存在栈中c和保存在堆中test。而java中根本就不存在两个完全一模一样的字符串对象,故在堆中test应该是用字符串常量池中test  

例: 
String str1="abc";//中开辟块空存放str1str1向池String常量"abc" 
String str2="def";//中开辟块空存放str2str2向池String常量"def" 
String str3=str1+str2;//栈中开一块间存放引str3//str1+str2StringBuilder最后toString()返回一个String对象"abcdef"
//会在堆中辟一存放此象,str3指向堆(str1+str2)返回的String象。System.out.println(str3=="abcdef");//falsestr3堆中的"abcdef"象,而"abcdef"是字符中的象,结果falseJVMStringstr="abc"常量池在编时做  Stringstr3=str1+str2是在行时知道的,new对象是在运行时才做的 

14String 要设计不可 

  字符串常量池需String不可变。因String设计成不可变,当创建一String对象 时, 若此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的 对象。 如果字符串变量允许必变,会导致各种逻辑错误,如改变一个对象会影响到另一个 独立对象。  

  String对象可以缓hashCode。字符串的可变性保证hash码的唯一性,因此可以  StringhashCode,这样不用每次重新计算哈希码。在进行字符串比较时,可 以直接比hashCode,提高了比较性能; 

  安全性。Stringjava类用来当作参数,url地址,文path路径,反射机制  Strign参数等String可变,将引起各种安全隐患 

15Redis 见的几种数结构说一下?各的使景? 

string 

介绍:string 数据结构是简单的 key-value 型。 

使用场景: 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。 

list 

介绍:list 即是  

使用场景:发布与订阅或者说消息队列、慢查询。 

hash 

介绍:hash 类似于 JDK1.8 前的 HashMap内部实现也差不多(数组 + 链表) 使用场景:系统中对象数据的存储。 

set 

介绍:set 类似于 Java 中的 HashSet Redis 中的 set 类型是一无序集合,集合中的元素没有先后顺序。当你需要存储一个列表数据,又不希望出现重复数据时set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也 list 所不提供的。可以基于 set 轻易实现交集、并集、差集的操作 
使用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景 

sorted set 

介绍:和 set 相比,sorted set 增加了一个权重参数 score,使得集合中的元素能够 score 进行有序排列,还可以通过 score 的范围来取元素的列表。有点像是 Java  HashMap  TreeSet 的结合体 

使用场景:需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。 

bitmap 

介绍:bitmap 存储是连续的二进制数字(0  1),通过 bitmap, 只需要一个 bit 表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8  bit 可以组成一 byte,所以 bitmap 身会极大的节省储存空间。 

使用场景:适合需要保存状态信息(比如是否签到、是否登录...)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。。 

16、谈一缓存穿透、缓击穿存雪崩以及各自的解决 

缓存穿透 

  问题:大量并发查询不存在KEY,在缓存和数据库中都不存在,同时给缓存和数据库带 来压力。 

  原因:一般而言,缓存穿透2种可能性:业务数据被误删,导致缓存和数据库中都没有 数据。恶意进ddos 攻击。 

  分析:为什么会多次透传呢?不存在 一直为空,需要注意让缓存能够区KEY不存在和 查询到一个空值。 

  解决办法:缓存空值KEY,这样第一次不存在也会被加载会记录,下次拿到有这个 KEYBloom过滤RoaingBitmap KEY是否存在,如果布隆过滤器中没有查到这 个数据,就不去数据库中查。在处理请求前增加恶意请求检查,如果检测到是恶意攻击, 则拒绝进行服务。完全以缓存为准,使用延迟异步加载的策略(异步线程负责维护缓存的 数据,定期或根据条件触发更新),这样就不会触发更新 

缓存击穿 

  问题:某KEY失效的时候,正好有大量并发请求访问这KEY 

  分析:跟穿透其实很像,属于比较偶然的。 

  解决办法:KEY的更新操作添加全局互斥锁。完全以缓存为准,使用延迟异步加载的策略 (异步线程负责维护缓存的数据,定期或根据条件触发更新),这样就不会触发更新 

缓存雪崩

 

问题:当某一时刻发生大规模的缓存失效的情况,导致大量的请求无法获取数据,从而将

流量压力传导到数据库上,导致数据库压力过大甚至宕机 

  原因:一般而言,缓存雪崩2种可能性:大量的数据同一个时间失效:比如业务关系强 相关的数据要求同时失Redis 宕机 

  分析:一般来说,由于更新策略、或者数据热点、缓存服务宕机等原因,可能会导致缓存 数据同一个时间点大规模不可用,或者都更新。所以,需要我们的更新策略要在时间上合 适,数据要均匀分享,缓存服务器要多台高可用。 

  解决办法:更新策略在时间上做到比较平均。如果数据需要同一时间失效,可以给这批数 据加上一些随机值,使得这批数据不要在同一个时间过期,降低数据库的压力。使用的热 数据尽量分散到不同的机器上。多台机器做主从复制或者多副本,实现高可用。做好主从 的部署,当主节点挂掉后,能快速的使用从结点顶上。实现熔断限流机制,对系统进行负 载能力控制。对于非核心功能的业务,拒绝其请求,只允许核心功能业务访问数据库获取 数据。服务降价:提供默认返回值,或简单的提示信息。 

17、讲下 KafkaRabbitMQRocketMQ 的区别是什么 

性能 

消息中间件的性能主要衡量吞吐量,Kafka的吞吐量RabbitMQ要高1~2个数量级,RabbitMQ的单QPS在万级别,Kafka的单QPS能够达到万级别RocketMQ单机写TPS单实例7万条/秒,单机部3Broker,可以跑到最12万条/秒,消大小10个字节,Kafka果开启幂等、事务等功能,性能也会有所降低 

数据可靠性 

KafkaRabbitMQ都具备多副本机制,数据可靠性较高。RocketMQ支持异步实时刷盘,同步刷盘,同Replication,异Replication 

服务可 

Kafka采用集群部署,分区与多副本的设计,使得单节点宕机对服务无影响,且支持消息容量的线性提升。RabbitMQ支持集群部署,集群节点数量有多种规格RocketMQ是分布式架构,可用性高。 

功能 

KafkaRabbitMQ都是比较主流的两款消息中间件,具备消息传递的基本功能,但在一些特殊的功能方面存在差异,RocketMQ在阿里集团内部有大量的应用在使用。 

18Kafka 的架说一下 

整个架构中包括三个角色。 

  生产者(Producer):消息和数据生产者。 

 

 

代理(Broker):缓存代理,Kafka的核心功能 

消费者(Consumer:消息和数据消费者。 

KafkaProducerConsumer提供注册的接口,数据Producer发送BrokerBroker承担一个中间缓存和分发的作用,负责分发注册到系统中Consumer 

19Kafka 怎么证消息有序 

消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。Kafka 偏移量(offset)来保消息在分区内的顺序性。发送消息的时候指key/Partition 

20Kafka 怎么证消息丢失 

生产者丢失消息的情况 

生产者(Producer) send方法发送消息之后,消息可能因为网络问题并没有发送过去 为了确定消息是发送成功,我们要判断消息发送的结果,Kafka 生产者(Producer) 使用 send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果,但是这样也让它变为了同步操作,可以采用为其添加回调函数的形式,示例代码如下 
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, o);   future.addCallback(result -> logger.info("生产者功发消息topic:{} partition:{}的消", result.getRecordMetadata().topic(), result.getRecordMetadata().partition()), 

 ex -> logger.error("产者送消,原因{}", ex.getMessage())); 

 Producer retries(重试次数)设置一个比较合理的值,一般 3 ,但是为了保证消不丢失的话一般会设置比较大一点。设置完成之后,当出现网络问题之后能够自动重试消息发送,避免消息丢失。另外,建议还要设置重试间隔,因为间隔太小的话重试的效果就不明显了,网络波动一次3次一下子就重试完了 

消费者丢失消息的情况 

当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提了。 

解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后再自己手动提交 offset  ,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结自己挂掉了,那么这个消息理论上就会被消费两次。 

Kafka 弄丢了消 

试想一种情况:假如 leader 副本所在的 broker 突然挂掉,那么就要从 follower 副本重新选出一个 leader ,但是 leader 的数据还有一些没有被 follower 副本的同步的话,就会造成消息丢失。 

当我们配置了 unclean.leader.election.enable = false 的话, leader 副本发生故障时就不会从 follower 本中 leader 同步度达不到要求的副本中选择 leader ,这降低了消息丢失的可能性。 

21Kafka 怎么决重复费? 

  生产者发送每条数据的时候,里面加一个全局唯一id,消费到了之后,先根据这id 去比Redis里查一下,之前消费过吗,如果没有消费过,就处理,然后这id Redis。如果消费过就别处理了。 

  基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据 插入只会报错,不会导致数据库中出现脏数据。 

22、介绍 MySQL 聚簇引与簇索引区别InnoDB  Myisam

擎) 

聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有 个聚簇索引,因为一个表的物理顺序只有一种情况,所以,对应的聚簇索引只能有一个 聚簇索引的叶子节点就是数据节点,既存储索引值,又在叶子节点存储行数据  

Innodb 创建表后生的文件有:  

frm:创建表的语句  

idb:表里面的数据+索引文  
非聚集索引(MyISAM 引擎的底层实现)的逻辑顺序与磁盘上行的物理存储顺序不同。非聚簇 索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。索引命中后,需要回表查 询。 

Myisam 创建表后生的文件有:  
frm:创建表的语MYD:表里面的数据文件(myisam data  MYI:表里面的索引文myisam index  

innodb的次索引指对主键的引用 (聚簇索引)  

myisam的次索引和主索引都指向物理行 (非聚簇索引)  

23、然后一个合索(a,b)一个语句,select * from table where b =

'xxx',判断是否命中索?为 

不能命中。 

对于查SELECT * FROM TABLE WHERE a=xxx and b=xxx然是可以使用(ab)这个联合索引的。 

对于单个a列查SELECT * FROM TABLEWHERE a=xxx,也可以使用这个(ab)索引。 

但对b列的查SELECT *FROM TABLE WHERE b=xxx,则不以使用这B+树索引。 innoDb 数据引擎,可以发现叶子节点上b121412,显然不是排序的,因此对b列的查询使用不到(ab)的索引 

24Java 线哪几种现方 

  通过继Thread类创建线程类 

  Runnable接口建线程 

  CallableFuture接口创建线程 

25、用过 ConcurrentHashMap,讲一下他 HashTable 同之 

  HashTable就是实现HashMap加上synchronizedConcurrentHashMap底层 采用分段的数组+链表实现,线程安全 

  ConcurrentHashMap通过把整MapNSegment,可提供相同的线程安 全,但是效率提N倍,默认提16 

  并且读操作不加锁,由HashEntryvalue变量是 volatile也能保证读取到最新 的值。 

  Hashtablesynchronized是针对整Hash表的,即每次锁住整张表让线程独占, ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术 

  扩容:段内扩容(段内元素超过该段对Entry数组长度75%扩容,不会对整个 Map进行扩容),插入前检测需不需要扩容,有效避免无效扩 

26Java 线程安 

  使用同步代码块 

  使用同步方法 

  使Lock锁机制, 通过创Lock对象,lock()加锁unlock()解锁,来保护指定 的代码块 

27、描述 ThreadLocal线程量)的层实现原理及常场景。 

实现原理:  

  Thread线程内部都有一ThreadLocalMap;以线程作key,泛型作value,可 以理解为线程级别的缓存。每一个线程都会获得一个单独map 

  提供setget等访问方法,这些方法为每个使用该变量的线程都存有一份独立的副 本,因get方法总是返回由当前执行线程在调set时设置的最新值。 

应用场景:  

  JDBC连接  

  Session  

  Spring事务管  

  调用链,参数传递  

  AOP 
ThreadLocal是一个解决线程并发问题的一个类,用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选ThreadLocal变量。例如,由JDBC连接对象不是线程安全的,因此,当多线程应用程序在没有协同的情况下,使用全局变量时,就不是线程安全的。通过JDBC的连接对象ThreadLocal中,每 个线程都会拥有属于自己的连接对象副本。  

28、介绍 Spring Bean 都有用域  

  singleton : bean在每Spring IOC器中只有一个实例。  

  prototypebean的定义可以有多个实例。  

  request:每http请求都会创建一bean  

  session:在一HTTP Session中,一bean定义对应一个实例  

  globalsession  

  application  

29、注解 @Autowired  @Resource 么区别? 

  ResourceJDK的,AutowiredSpring提供 

  Resource不允许找不bean的情况,Autowired允许@Autowired(required =  false) 

  name的方式不@Resource(name = 

"baseDao"),@Autowired()@Qualifier("baseDao") 
Resource默认通name查找,Autowired默认通type查找 
1@Autowired@Resource都可以用来装bean,都可以写在字段setter法上 

2@Autowired认按类型装配,默认情况下必须要求依赖对象存在,如果null,可以设置它required属性false。如果想使用名称装配可以结合@Qualifier进行使用。 

3@Resource默认按照名称进行装配,名称可以通name属性进行指定,如果没有指name属性,当解写字段上默认取字段名进行名称查找。如果注解写setter方法上默认取属性名进行装配。当找不到与名称匹配bean照类型进行装配。但是需要注意的是,如name属性一旦指定,就只会按照名称进行装配。 

30RPC 实现础? 

  需要有非常高效的网络通信,比如一般选Netty作为网络通信框架 

  需要有比较高效的序列化框架,比如谷歌Protobuf序列化框架 

  可靠的寻址方式(主要是提供服务的发现),比如可以使Zookeeper来注册服务等 等; 

  如果是带会话(状态)RPC调用,还需要有会话和状态保持的功能; 

31CMSG1 圾回收中的三色标记了吗? 

三色标记算法思想 

三色标记法是一种垃圾回收法,它可以JVM不发生或仅短时间发STW(Stop The World),从而达到清JVM内存垃圾的的。 

三色标记法将对象的颜色分为了黑、灰、白,三种颜色。 

黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象) 
灰色:对象已经被垃圾收集器扫描过了,但是对象中还存在没有扫描的引GC要从此对象中去寻垃圾) 
白色:表示对象没有被垃圾收集器访问过,即表示不可达。 

CMS 解决办法:增量更新 

在应对漏标问题时,CMS使用了增量更新(Increment Update)来做,在一个未被标记的对象(白色对象)被重新引用后,引用它的对象若为黑色则要变成灰色,在下次二次标记时让GC线程继续标记它的属性对象(但还是存在漏标的问题) 

CMS 两个命缺 

CMS采用Mark-Sweep算法,最后会产许多内存碎片,当到一定数量时CMS清理这些碎片了,CMSSerial Old垃圾理器来清理这些垃圾碎片,Serial Old处理器是单线程操作进行清理垃圾的,效率很低。 

所以使CMS就会现一种情况,硬件升级了,却越来越卡顿,其原因就是因为进Serial Old GC时,效率过 

解决方案:使Mark-Sweep-Compact算法,减少垃圾碎片 
调优参数(配套使用): 
-XX:+UseCMSCompactAtFullCollection CMS的压 
-XX:CMSFullGCsBeforeCompaction 0,指经过多少CMS FullGC才进行压 JVM认为内存不,再使CMS进行发清理内存可能会发OOM的问题,而得不进Serial Old GCSerial Old是单线程圾回收,效率低 

解决方案:降低触CMS GC的阈值,让动垃圾不那么容易占满老年代 
调优参数: 
-XX:CMSInitiatingOccupancyFraction 92% 可以降低这个值,让老年代占用率达到该值就进CMS GC 

G1 解决办法:SATB 

SATB(Snapshot At The Beginning), 在应漏标问题时,G1使用SATB方法来,具体流程: 

  在开始标记的时候生成一个快照图标记存活对象 

  在一个引用断开后,要将此引用推GC的堆栈里,保证白色对象(垃圾)还能GC线 程扫描到(**write barrier(写屏障)**里把所有旧的引用所指向的对象都变成非白的) 

  Rset,去扫描Region引用到当的白色对象,若没有引用到当前对象,则回 G1 会不会进行 Full GC 

会,当内存满了的时候就会进Full GCJDK10之前Full GC,为单线程的,所以使用G1需要避Full GC的产生。 

解决方案: 

  加大内存; 

  CPU性能,加GC回收速度,而对象增加速度赶不上回收速度,Full GC可以避 免; 

  降低进Mixed GC触发的阈值,Mixed GC提早发生(默45% 

更多推荐

2022腾讯面试题

本文发布于:2023-04-30 09:16:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/8db3777dd1c9970c8469661772844e3f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:腾讯   面试题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 113770文章数
  • 28854阅读数
  • 0评论数