字节跳动Java岗面试题;你有过迷茫吗?持续更新大厂面试笔试题

前言

JVM调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用可以使用更少的内存以及延迟获取更大的吞吐量。绝不夸张地说,JVM是现代软件工程最成功的案例之一。由于它自带GC,又有无数能够微调的参数,且运行极其稳定可靠,因此,许多厂商的核心业务系统,才敢放心地用Java编写,运行在JVM之上。面试

近几年深刻学习JVM调优的人愈来愈多,由于互联网一线大厂的Java高级开发工程师JD中都明确要求了“JVM调优”的能力。JVM调优是跳槽大厂必备的技能,可是因为JVM知识体系过于庞大,非系统学习难以学透,而且即便掌握了所有理论,没有实操,依然没法应对面试!redis

今天,特将腾讯大佬疯狂加持的“百万级”JVM调优笔记分享给大家,从思惟图到优化再到架构,带你轻松上手,一键搞定。数据库

1. static 和 final 的用法

static 的做用从三个方面来谈,分别是静态变量、静态方法、静态类。设计模式

静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不产生static 变量的拷贝,而是该类全部实例变量共用同一个 static 变量。也就是说这个静态变量只加载一次,只分配一块储存空间。缓存

静态方法: 声明为static的静态方法有如下几个特色:性能优化

  • (1)静态方法只能调用静态方法;服务器

  • (2)静态方法只能访问静态数据;多线程

  • (3)静态方法不能以任何方式引用this或super;架构

静态类:一般一个普通类不容许声明为静态,只有一个内部类才能够(main方法就是一个典型),这时这个声明的静态类能够直接做为一个普通类来使用,而不须要实例一个外部类。ide

final 的做用从变量、方法、类三个方面来理解:

  • final修饰的变量的值不能被修改,是一个常量;

  • final修饰的方法不能被重写;

  • final修饰的类不能被继承;

2. 抽象类和接口的区别,类能够继承多个类吗,接口能够继承多个接口吗,类能够实现多个接口吗?

抽象类和接口都不能直接实例化,若是要实例化,抽象类变量必须指向实现全部抽象方法的子类对象,接口变量必须指向实现全部接口方法的类对象。

抽象类要被子类继承,接口要被类实现。

接口只能作方法声明,抽象类中能够作方法声明,也能够作方法实现

接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

抽象类里的抽象方法必须所有被子类所实现,若是子类不能所有实现父类抽象方法,那么该子类只能是抽象类。一样,一个实现接口的时候,如不能所有实现接口方法,那么该类也只能为抽象类。

抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。

抽象类里能够没有抽象方法 。

若是一个类里有抽象方法,那么这个类只能是抽象类 。

抽象方法要被实现,因此不能是静态的,也不能是私有的。

接口可继承接口,并可多继承接口,但类只能单根继承。

3. this和super的功能和用法

this

  • (1) 能访问除构造方法之外全部的属性、方法,经过this.来调用方法和属性

  • (2) 不能够在静态方法中使用

  • (3) 在构造方法中使用this(参数列表) 调用本类的其它构造方法,必须放在构造方法的第一句。

super :访问父类的方法和属性

  • (1) 访问父类的方法和属性;

  • (2) 在构造方法中经过 super(参数列表) 来调用父类的构造方法,必须放在子类构造方法里的第一行。

4. final, finally, finalize 的区别?

final:修饰符(关键字)有三种用法:若是一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承。将变量声明为final,能够保证它们在使用中不被改变,被声明为final 的变量在初始化之后的引用中只能读取不可修改。被声明为 final 的方法也一样只能使用,不能在子类中被重写。

finally:一般放在try…catch的后面构造老是执行代码块,这就意味着程序不管正常执行仍是发生异常,这里的代码只要JVM不关闭都能执行,能够将释放外部资源的代码写在finally块中。

finalize:Object类中定义的方法,Java中容许使用finalize() 方法在垃圾收集器将对象从内存中清除出去以前作必要的清理工做。这个方法是由垃圾收集器在销毁对象时调用的,经过重写finalize() 方法能够整理系统资源或者执行其余清理工做。

5. Error 和 Exception 有什么区别?

Error 表示系统级的错误和程序没必要处理的异常,是恢复不是不可能但很困难的状况下的一种严重问题;好比内存溢出,不可能期望程序能处理这样的状况;

Exception 表示须要捕捉或者须要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示若是程序运行正常,从不会发生的状况。

6. 说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy()方法。

与CGI的区别在于Servlet处于服务器进程中,它经过多线程方式运行其service方法,一个实例能够服务于多个请求,而且其实例通常不会销毁,而CGI对每一个请求都产生新的进程,服务完成后就销毁,因此效率上低于Servlet。

7. 如何防止缓存雪崩?

缘由

缓存雪崩多是由于数据未加载到缓存中,或者缓存同一时间大面积的失效,从而致使全部请求都去查数据库,致使数据库CPU和内存负载太高,甚至宕机。

对应解决

采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库形成太大的压力。这种办法虽然能缓解数据库的压力,可是同时又下降了系统的吞吐量。

分析用户行为,尽可能让失效时间点均匀分布。避免缓存雪崩的出现。

若是是由于某台缓存服务器宕机,能够考虑作主备,好比:redis主备,可是双缓存涉及到更新事务的问题,update可能读到脏数据,须要好好解决。

8. 谈谈你对MVC的理解

MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。

MVC中的模型、视图、控制器它们分别担负着不一样的任务。

视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。

模型: 模型表示业务数据和业务处理,至关于JavaBean。一个模型能为多个视图提供数据。这提升了应用程序的重用性。

控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求,而后根据处理的结果调用相应的视图来显示处理的结果。

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并经过视图呈现给用户。

相关文章
相关标签/搜索