JAVA常见面试题问题简述(连续更新中)

JAVA常见面试题问题简述

1. springcloud和dubbo的区别

  ①相比之下springcloud 的社区会加倍活跃,解决问题的速率也会越来越快,dubbo相对来说若是碰着没有解决的问题,就不得不去维护框架源码。

  ②架构完整度来说,dubbo只是解决了服务治理,需要其他的组件,需要自己去适配。springcloud 就拥有很完善的一些列解决方案,如服务网关,断路器,分布式设置,等等

  ③服务的挪用方式:dubbo 是rpc, springcloud 是rest API, dubbo的服务挪用有很强的依赖性,因此岂论开发、测试、集成环境都需要严酷的治理版本依赖,才不会泛起服务方与挪用方的不一致导致应用无法编译乐成等一系列问题。往往若是服务方有改动的话,需要更新然后install 才气举行后续开发; REST API 服务方和挪用方的依赖可以说就是接口文档,若是接口修改了,文档没有实时修改也很有可能泛起问题,以是最好就是集成swagger,让每个服务的代码与文档一体化,就能解决。以是在分布式环境下,REST方式的服务依赖要比RPC方式的依赖更为天真。

  ④对外提供服务时,由于不知道别人是什么语言写的,都市以REST的方式提供出去,然则dubbo若是要对外提供服务就需要在实现一层,将rpc转换为rest接口对外提供。

  总结:dubbo就像一台组装电脑,各组件选择度是对照高的,然则很有可能由于某个组件的问题,导致整个电脑出问题。 但若是是手艺大佬这都不是问题。spring cloud 就像品牌机,对各组件的整合兼容做了大量的测试,保证了机械拥有更高的稳定性。

 

2.谈一下spring的明白

  ① spring 为什么会泛起:初学java 的手 jsp+servlet+mysql+jdbc 在操作dao 或者service层的时刻都需要new 或者 单例模式来获取一个bean 这样不仅耦合度对照高,而且在内存大量建立实例,销毁实例,对照虚耗CPU资源,所有spring就泛起了,由spring来控制工具的依赖关系,工具的生命周期。

  ②在营业系统里除了要实现营业功效之外,还要实现如权限阻挡、性能监控、事务治理等非营业功效。通常的作法是非营业的代码穿插在营业代码中,从而导致了营业组件与非营业组件的耦合。

 

3.谈谈springmvc的流程

JAVA常见面试题问题简述(连续更新中)

 

 

 

  ①用户提议请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以接见Servlet、哪些不能接见。就是url-pattern的作用,而且会加载springmvc.xml设置文件。

  ②前端控制器会找到处置器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简朴来说,就是将在springmvc.xml中设置的或者注解的url与对应的处置类找到并举行存储,用map<url,handler>这样的方式来存储。

  ③HandlerMapping有了映射关系,而且找到url对应的处置器,HandlerMapping就会将其处置器(Handler)返回,在返回前,会加上许多阻挡器。

  ④DispatcherServlet拿到Handler后,找到HandlerAdapter(处置器适配器),通过它来接见处置器,并执行处置器。

  ⑤执行处置器

  ⑥处置器会返回一个ModelAndView工具给HandlerAdapter

  ⑦通过HandlerAdapter将ModelAndView工具返回给前端控制器(DispatcherServlet)

  ⑧前端控制器请求视图剖析器(ViewResolver)去举行视图剖析,凭据逻辑视图名剖析成真正的视图(jsp),实在就是将ModelAndView工具中存放视图的名称举行查找,找到对应的页面形成视图工具

  ⑨返回视图工具到前端控制器。

  ⑩视图渲染,就是将ModelAndView工具中的数据放到request域中,用来让页面加载数据的。

  ⑪通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够举行视图渲染了。最后将其返回即可。

 

4.说说JVM内存模子

  内存模子:主要界说了程序中各个变量的接见规则

  JAVA内存模子主要分为主存和事情线程,当事情线程需要用到主存中的数据时,需要将主存中的数据拷贝一份到事情线程中。

 

5.说说JAVA内存结构

JAVA常见面试题问题简述(连续更新中)

 

 

 

  1. 各内存空间的明白

  ①方式区:当类被加载到jvm时,需要一个内存空间来纪录类的信息,如类的全类名,变量名,方式名,接见权限等等。

  ②堆:当一个类通过new 被建立时,需要一个区域来保留类的实例工具,如 Student student = new Student(); 这时刻Student的实例工具保留在堆内存中。

  ③虚拟机栈:当运行某个类的方式时,若是方式有局部变量那么就需要一个区域来存放局部变量,这个内存区域叫做虚拟机栈,每个线程都有自己的虚拟机栈。栈的数据机构为LIFO 后进先出。 为什么要设计这样的数据结构呢:当a方式挪用b方式时,a先进栈,然后b进栈,b运行完后,继续执行a的方式。

【tensorflow2.0】处置图片数据-cifar2分类

  ④当底层API不是java语言写的时刻,就需要挪用native方式,native方式的实现凭据差别的操作系统会有差别,这也是jvm夸平台的缘故原由,好比最简朴的System.out 也是挪用的native方式。既然后native方式与java语言自己写的方式差别,这里就需要一个线程对应的内存空间,也就是内陆方式栈,来存放native方式中的局部变量表之类的信息。

 

6,类加载历程

JAVA常见面试题问题简述(连续更新中)

 

 

  ①加载:将外部的.class文件调入内存,在.class文件加载至方式区后,会在堆中建立一个java.lang.Class工具,对来封装类的信息,类加载的最终产物就是位于堆中的Class工具(注重不是目的类工具),该工具封装了类在方式区中的数据结构,而且向用户提供了接见方式区数据结构的接口,即Java反射的接口。

  ②将java类的二进制代码合并到JVM的运行状态之中的历程

  验证:确保加载的类信息相符JVM规范,没有平安方面的问题

  准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方式区中举行分配

  剖析:虚拟机常量池的符号引用替换为字节引用历程

 

观点注释:

JVM中的直接引用和符号引用

符号引用:

  官方:符号引用以一组符号来形貌所引用的目的。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目的即可,符号引用和虚拟机的结构无关。

  小我私家明白:在虚拟机编译java类为class文件,在编译时不知道引用类的地址,这个时刻多以符号来取代。在JVM加载类的剖析阶段将这个符号转化为现实的内存地址。

直接引用:

     官方:直接引用和虚拟机的结构是相关的,差别的虚拟机对于相同的符号引用所翻译       出来的直接引用一样平常是差别的。若是有了直接引用,那么直接引用的目的一定被加载 到了内存中。

  小我私家明白:1. 直接指向目的的指针(指向工具,类变量,类方式的指针)

                2. 相对偏移量(指向实例的变量,方式的指针)

                3. 一个间接定位到工具的句柄。

    PS:偏移量:存储单元的现实地址与其所在段的段地址之间的距离称为段内偏移,也称为“有用地址或偏移量”

 

  ③初始化

  这个阶段主要是对类变量初始化,是执行类组织器的历程。

  换句话说,只对static修饰的变量或语句举行初始化。

  若是初始化一个类的时刻,其父类尚未初始化,则优先初始化其父类。

  若是同时包罗多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

 

7.类加载器的条理结构

  JAVA常见面试题问题简述(连续更新中)

 

 

  Bootstrap ClassLoader:<JAVA_HOME>/lib路径下的焦点类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中。是由C++来实现的

  Extension ClassLoader:<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库

  Application ClassLoader:卖力加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器

 

8.明白双亲委派模子

  接纳双亲委派模式的是利益是Java类随着它的类加载器一起具备了一种带有优先级的条理关系,通过这种层级关可以制止类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到平安因素,java焦点api中界说类型不会被随意替换,假设通过网络通报一个名为java.lang.Integer的类,通过双亲委托模式通报到启动类加载器,而启动类加载器在焦点Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络通报的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止焦点API库被随意窜改。可能你会想,若是我们在classpath路径下自界说一个名为java.lang.SingleInterge类(该类是胡编的)呢?该类并不存在java.lang中,经由双亲委托模式,通报到启动类加载器中,由于父类加载器路径下并没有该类,以是不会加载,将反向委托给子类加载器加载,最终会通过系统类加载器加载该类。然则这样做是不允许,由于java.lang是焦点API包,需要接见权限,强制加载将会报出如下异常。

 

原创文章,作者:7h28新闻网,如若转载,请注明出处:https://www.7h28.com/archives/4281.html