【面试】二、Java补充知识

JVM中的存储

JVM的五块存储区:

  • 方法区(线程共享)

    方法区用来存储类的各种信息(类名、方法信息等)、静态变量、常量和编译后的代码也存储在方法区中

    • 方法区中也存在运行时常量池

      ​ 常量池中会存放程序运行时生成的各种字面量和引用信息

  • 虚拟机栈

    虚拟机栈由一个个的栈帧组成、每一个栈帧对应一个被调用的方法,存储局部变量、操作数、方法的返回地址等。

  • 本地方法栈

    用于管理本地方法的调用(Native标识、负责与非Java语言的交互)

  • 堆(线程共享)

    堆中存储的是程序中创建出的对象实例(类的成员变量),垃圾回收机制也是主要作用于堆

  • 程序计数器

    存放要执行的指令地址

字符串在JVM中的存储

创建一个字符串时,回先检查字符串常量池中是否存储有对应的字符串,如果有,就把这个字符串拿到并赋值给对象,如果没有那就创建一个对象并把这个字符串加到常量池中。

SpringMVC的工作流程

  • 用户通过浏览器发送一个Http请求,这个请求会被DispatcherServlet拦截

  • DispatcherServlet调用HandlerMapping找到具体的Handler和拦截器。

  • 将获取到的具体的Handler信息发送给HandlerAdapter

  • HandlerAdopter根据Handler信息找到并执行对应的请求(Controller)并进行处理

  • Handler执行完毕之后返回给HandlerAdopter一个ModelAndView对象

  • HandlerAdopter接收到ModelAndView对象之后会将该对象返回给DispatcherServlet

  • DispatcherServlet在接收到ModelAndView对象之后会使用视图解析器对视图进行解析

  • 视图解析完成之后会将View返回给DispatcherServlet

  • DIspatcherServlet在接收到视图之后会进行视图渲染并将数据注入到View中对应的域中,生成最终的View并将结果返回给浏览器。

面试需要知道的Linux指令

查看日志:tail -f filename
ls
mkdir
cd 
zip / unzip (.zip文件)
gzip / gunzip (.gz文件)
tar -c (压缩文件) / tar -x (解压文件) (.tar文件)
cp 
rm (删除空目录) rm -f(递归删除目录)

数据库索引

数据库索引是一种特殊的文件、包含着对数据库表中所有记录的引用指针

索引可以有效的提高搜索效率

没有Where的情况、使用IS NULL的情况、比较不匹配的数据类型等等时、数据库索引会失效

Java垃圾回收机制

GC是Java垃圾回收机制的关键原理,垃圾回收是JVM中的重要功能:

垃圾回收分为两个阶段:

  • 垃圾标记阶段:

    垃圾只有先被标记出来了才可以被处理、在标记阶段有两种算法:

    • 引用计数算法

      对于每一个创建出来的对象都维护一个标记(整数),每多一次引用就将标记+1、引用结束就将标记-1,直至标记为0时就将这个对象标记为垃圾。

      优点:实现简单,逻辑清楚

      缺点:每个对象都要维护一个标记,浪费空间,且无法处理循环引用(Java没有这样做)

    • 可达性分析算法(JVM)

      GC会定义GC Roots节点、GC Roots节点可以是虚拟机栈中引用的对象(局部变量)、方法区中的静态变量、常量、本地方法栈中引用的对象、被同步锁(Synchronized)持有的对象、JVM的内部引用等。GC会从这个GC roots集合中进行搜索,查看被这些变量引用的对象以及查找到的这些对象引用的对象,这些被查找到的对象就被视为非垃圾、其他的就被视为垃圾。

    在JVM中、没有GC Roots的引用会对对象进行第一次标记、对finilize()方法进行检测与调用是第二次标记,两次标记都生效后,就彻底被归为需要回收的垃圾

  • 垃圾清理阶段

    • 标记-清除算法

      标记清除算法会在堆空间耗尽时进行全盘扫描,记录标记为垃圾的内容的地址并维护一张垃圾清单,下次有新内容进入时,会直接覆盖清单上的地址。

      缺点:需要维护一个空闲地址清单。 在进行回收时需要停止整个程序。回收出来的地址空间不连续,容易造成内存碎片。

    • 复制算法

      将内存空间分为两块,正常时使用一块,在进行垃圾回收时将还存活的内容复制到另一块并清除原先的所有内容。

      注意复制算法不标记需要清除的内容,只对非垃圾进行复制。

      缺点:需要两倍的内存空间、在回收时若发生存活内容较多的情况时需要复制很多内容。

    • 标记-压缩算法

      其将所有标记为存活的对象紧凑到内存地址的一端,解决了标记-清除算法产生内存碎片的问题,但仍然会造成STW停止。

    • 分代收集算法(JVM)

      利用JVM的分代模型(JVM将堆内容分为新生代和老生代)(新生代的内容大多存活时间较短、老生代的内容存活时间较长)

      对于两个区域实行不一样的垃圾清理算法,对于新生代使用复制算法

      对于老生代使用标记-清除或者标记-复制算法

    • 同时还有:

    • 增量收集算法:垃圾回收与线程交替进行(并发),来避免STW(会增加线程切换的开销)

    • 分代算法:将整个堆空间再进行划分(控制STW的时间)

CMS收集器一致维护到JDK14、在JDK15中将CMS移除:

CMS可以实现垃圾收集的并发处理

1. 初始标记:通过GC Roots搜索所有直接关联的子节点(很短时间的STW)
2. 并发标记:进行可达性分析,找出不可达的对象(与正常线程并行执行,无STW)。
3. 重新标记:重新标记在并发标记时发生变化的对象(STW)
4. 并发清理:对垃圾进行并行的清理,即清理不影响其他线程

CMS基本实现了无STW情况的垃圾回收,但CMS也有以下缺点:

  1. 占用CPU资源(线程的收集)
  2. 无法处理浮动垃圾(在并发清理的阶段仍然有新的垃圾生成)
  3. 需要预留出足够的内存
  4. 产生大量内存碎片(标记-清除算法)

封装关键词

public:当前类、同包、子类、其他包

protected:当前类、同包、子类

缺省:当前类、同包

private:当前类

short s1 = 1; s1 = s1 + 1;	//会报错,因为会short自动转换成int(存在小转大、有损失)
short s1 = 1; s1 += 1;	//不会报错,+=会自动进行转换操作,将1转换为short(截断)

你可能感兴趣的:(java,面试,jvm)