您的位置 首页 java

Java面试八股之每日5问「07」

1. Tomcat 为什么要破坏双亲委派

Tomcat需要解决的问题

  1. 如有多个应用程序部署在Tomcat上,这些应用程序可能会依赖 同一第三方类库的不同版本 ,因此Tomcat必须支持 每个应用程序的类库可以相互隔离
  2. 部署在同一个Tomcat上的不同应用程序, 相同类库的相同版本应该是共享的 ,否则就会出现大量相同的类加载到虚拟机中
  3. Tomcat本身也有依赖的类库,与应用程序依赖的类库可能会混淆,基于安全考虑,应该将两者进行隔离
  4. 要支持 Jsp 文件修改后,其生成的class能在不重启的情况下及时被加载进 JVM

采用默认机制会出现的问题

  • 问题1、3,如果Tomcat采用默认的双亲委派加载机制,是无法加载同一类库不同版本的类的,因为默认的双亲委派加载机制在加载类时,是通过类的全限定名做唯一性校验的
  • 问题2,默认的双亲委派类加载机制可以实现,因为它本就能保证唯一性
  • 问题4,我们知道Jsp文件更新其实也就是 class文件 更新了,此时类的全限定名并没有改变,修改Jsp文件后,类加载器会从方法区中直接取到已存在的,这会导致修改后Jsp文件其实不会重新加载。那么,如果直接卸载掉这个Jsp文件的类加载器,再重新创建类加载器去加载修改后的Jsp文件,不就能解决问题了吗?那么你应该能猜到 每个Jsp文件应对应一个唯一的类加载器

参考文章:

2.Tomcat如何打破双亲委派

  • Tomcat通过自定义类加载器WebAppClassLoader打破双亲委派,即重写了JVM的类加载器ClassLoader的findClass方法和loadClass方法,以优先加载Web应用目录下的类。
  • Tomcat负责加载我们的 Servlet 类、加载Servlet所依赖的 JAR 包。Tomcat本身也是个 Java 程序,因此它需要加载自己的类和依赖的JAR包。
  • 若在Tomcat运行两个Web应用程序,它们有功能不同的同名Servlet,Tomcat需同时加载和管理这两个同名的Servlet类,保证它们不会冲突。所以Web应用之间的类需要隔离
  • 若两个Web应用都依赖同一三方jar,比如 Spring ,则Spring jar被加载到内存后,Tomcat要保证这两个Web应用能共享,即Spring jar只被加载一次,否则随着三方jar增多,JVM的内存会占用过大。 所以,和 JVM 一样,需要隔离Tomcat本身的类和Web应用的类。

总结

Tomcat的Context组件为每个Web应用创建一个WebAppClassLoader类加载器,由于不同类加载器实例加载的类是互相隔离的,因此达到了隔离Web应用的目的,同时通过CommonClassLoader等父加载器来共享第三方JAR包。

参考文章:

3.最左匹配原则的底层原理

联合索引的底层还是一颗 B+树 ,只不过联合索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树。 例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的

Java面试八股之每日5问「07」

  • a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。
  • 所以b = 2这种查询条件没有办法利用 索引 ,因为联合索引首先是按a排序的,b是无序的。
  • 同时在a值相等的情况下,b值又是按顺序排列的,但是这种顺序是相对的。所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。例如a = 1 and b = 2 a,b字段都可以使用索引,因为在a值确定的情况下b是相对有序的,而a>1and b=2,a字段可以匹配上索引,但b值不可以,因为a的值是一个范围,在这个范围中b是无序的 参考文章:

4.like模糊查询%在前面为什么会失效

索引的数据结构是B+树,而索引是有序排列的。在进行模糊查询的时候,如果把 % 放在了前面,最左的 n 个字母便是模糊不定的,无法根据索引的有序性准确的定位到某一个索引,只能进行全表扫描,找出符合条件的数据。

如:where like ‘%abc’

  • 因为最左是%,无法确定是哪一个字母,只能根据abc去全表扫描找到符合的数据。
  • 模糊查询时,把 % 放在最左是违背了索引有序排列的规则,就会造成索引失效,进行全表扫描。
  • 在使用联合索引时也是如此,如果违背了索引有序排列的规则,同样会造成索引失效,进行全表扫描。

参考文章:

5.Java 8大基本类型所占字节数(或 bit 数)

类型

存储需求

bit 数

取值范围

备注

int

4字节

4*8

-2147483648~2147483647

即 (-2)的31次方 ~ (2的31次方) – 1

short

2字节

2*8

-32768~32767

即 (-2)的15次方 ~ (2的15次方) – 1

long

8字节

8*8

即 (-2)的63次方 ~ (2的63次方) – 1

byte

1字节

1*8

-128~127

即 (-2)的7次方 ~ (2的7次方) – 1

float

4字节

4*8

float 类型的数值有一个后缀 F(例如:3.14F)

double

8字节

8*8

没有后缀 F 的浮点数值(例如:3.14)默认为 double

boolean

1字节

1*8

true、false

char

2字节

2*8

Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。

参考文章:

文章来源:智云一二三科技

文章标题:Java面试八股之每日5问「07」

文章地址:https://www.zhihuclub.com/194821.shtml

关于作者: 智云科技

热门文章

网站地图