java开发工程师笔试题(4)

java开发工程师笔试小题

【来源:牛客网



1、下面有关JVM内存,说法错误的是?(C

  • A、 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
  • B、 虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
  • C、 方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
  • D、 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

解析如下:

大多数 JVM 将内存区域划分为:
   Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 )
   其中Method Area 和  Heap 是线程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。
   为什么分为线程共享和非线程共享的呢?请继续往下看。
首先我们熟悉一下一个一般性的 Java 程序的工作过程。
    一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),
    每个java程序都需要运行在自己的JVM上,
    然后告知 JVM 程序的运行入口,
    再被 JVM 通过字节码解释器加载运行。
    那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区)Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

2、下面有关servlet service描述错误的是(B)?

  • A、不管是post还是get方法提交过来的连接,都会在service中处理
  • B、 doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
  • C、 service()是在javax.servlet.Servlet接口中定义的
  • D、 service判断请求类型,决定是调用doGet还是doPost方法

解析如下:

GenericServlet 抽象类 给出了设计 servlet 的一些骨架,
定义了 servlet 生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的

3、下列有关Servlet的生命周期,说法不正确的是(A)?

  • A、在创建自己的Servlet时候,应该在初始化方法init()方法中创建Servlet实例
  • B 、在Servlet生命周期的服务阶段,执行service()方法,根据用户请求的方法,执行相应的doGet()或是doPost()方法
  • C 、在销毁阶段,执行destroy()方法后会释放Servlet 占用的资源
  • D、destroy()方法仅执行一次,即在服务器停止且卸载Servlet时执行该方法

解析如下:

Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源

4、下面有关servlet中init,service,destroy方法描述错误的是(D)?

  • A、init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
  • B、 service()方法处理客户机发出的所有请求
  • C、 destroy()方法标志servlet生命周期的结束
  • D、 servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的

解析如下:

init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,
           Servlet规范保证调用init方法前不会处理任何请求 
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 
           根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法 
destory方法:是在servlet实例被销毁时由web容器调用。
           Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,
           需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态

5、看以下代码:

文件名称:forward.jsp

<html>  
     <head><title> 跳转  </title> </head> 
     <body>  
         <jsp:forward page="index.htm"/>     
     </body>
 </html> 

如果运行以上jsp文件,地址栏的内容为(A

  • A、 http://127.0.0.1:8080/myjsp/forward.jsp
  • B、 http://127.0.0.1:8080/myjsp/index.jsp
  • C、 http://127.0.0.1:8080/myjsp/index.htm
  • D、 http://127.0.0.1:8080/myjsp/forward.htm
redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。
        举例:你去银行办事(forward.jsp),结果告诉你少带了东西,
        你得先去***局办(index.html)临时身份证,这时你就会走出银行,自己前往***局,地址栏变为index.html.
forward:请求转发:服务器行为,地址栏不变。
        举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),
        这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,你只要在警察局等就行。
        所以地址栏不变,依然为forward.jsp

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/108972346