JavaWeb面试题2

2.4.tomcat 优化

2.4.1.1.

答案一

Tomcat 作为 Web 服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

一、去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存

二、服务器所能提供 CPU、内存、硬盘的性能对处理能力有决定性影响。

(1) 对于高并发情况下会有大量的运算,那么 CPU 的速度会直接影响到处理速度。

(2) 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize 等参数

对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于 full GC,从而导致处理能力严重下降。

(3) 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。

三、利用缓存和压缩

对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了 Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,有效的减少了后端 tomcat 的访问。

另外,为了能加快网络传输速度,开启 gzip 压缩也是必不可少的。但考虑到 tomcat 已经需要处理很多东西了,

所以把这个压缩的工作就交给前端的 Nginx 来完成。

除了文本可以用 gzip 压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质

损失很小而文件可以减小很多。曾经我就见过一个图片从 300 多 kb 压缩到几十 kb,自己几乎看不出来区别。

四、采用集群

单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建 tomcat 集群是有效提升性能的手段。我们还是采用了 Nginx 来作为请求分流的服务器,后端多个 tomcat 共享 session 来协同工作。

五、

优化 tomcat 参数

这里以 tomcat7 的参数配置为例,需要修改 conf/server.xml 文件,主要是优化连接配置,关闭客户端 dns 查询。

<Connector port="8080"

protocol="org.apache.coyote.http11.Http11NioProtocol"

connectionTimeout="20000"

redirectPort="8443"

maxThreads="500"

minSpareThreads="20"

acceptCount="100"

disableUploadTimeout="true"

enableLookups="false"

URIEncoding="UTF-8" />

2.4.1.2.

答案二

在开发和面试过程中,经常遇到 tomcat 调优问题,目前可以从以下几个地方去优化;

1.通过动静分离来节约 tomcat 的资源

2.调整 tomcat 的线程池

3.调整 tomcat 的连接器

4.修改 tomcat 的运行方式

5.关闭 AJP 连接器

1.通过动静分离来节约 tomcat 的资源

动静分离来节约 tomact 的资源,通常采用;静态资源如果让 Tomcat 处理的话 Tomcat 的性能会被损耗很多,所以我们一般 都是采用:Nginx+Tomcat 实现动静分离,让 Tomcat 只负责

jsp 文件的解析工作,Nginx 实现静态资源的访问。

2.调整 tomcat 的线程池和调整 tomcat 的连接器

2.1 调整线程池通常和调整 tomcat 的连接器配合使用,具体修改参数如下:

<Executor name="tomcatThreadPool"

namePrefix="catalina-exec-"

maxThreads="150"

<!--最大处理连接数线程-->

minSpareThreads="4"

maxIdLeTime=6000/><!--保留最少线程 数-->

2.2 对应连接器的修改如下:

<Connector executor="tomcatThreadPool"

port="8080"

protocol="HTTP/1.1"

<!-- 使用的 BIO 模式-->

connectionTimeout="20000"

redirectPort="8443"

minProcessors="5"

<!-- 同时处理请求的最小数 -->

maxProcessors="75"

<!-- 同时处理请求的最大数 -->

acceptCount="1000" /> <!-- 接受最大并发数量 ,超过这个数量就会返回连接被拒绝 -->

3. 修改 tomcat 的运行方式: BIO,AIO,APR 三种模式

3.1.tomcat7.0 及之前使用 BIO 模式(堵塞)

3.2.tomcat8.0 及以后使用 AIO 模式(非堵塞 IO

3.3.如果操作系统未安装 APR 或者 APR 路径未指到 Tomcat 默认可识别的路 径,则 APR 模式无法启动,自动切换启动 NIO 模式。所以必须要安装 APR Native,直接启动就支持 APRAPR 是从操作系统级别解决异步 IO 问题,APR 的本质就是使用 JNI 技术调用操作系统底层的 IO 接口,所以需要提前安装所需要的依赖

4.关闭 AJP 连接器

AJP 的全称 Apache JServer Protocol,使用 Nginx+Tomca t 的架构,所以用不着 AJP 协议,所以把 AJP 连接器禁用.

配置如下:

注释<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

2.5.同步和异步有何异同,在什么情况下分别使用他们举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

Java 中交互方式分为同步和异步两种:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

哪些情况建议使用同步交互呢比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互

2.6.JSP

2.6.1. JSP 九大内置对象

JSP 一共有 9 个内置对象:

request:负责得到客户端请求的信息,对应类型:javax.servlet.http.HttpServletRequest

response:负责向客户端发出响应,对应类型:javax.servlet.http.HttpServletResponse

session:负责保存同一客户端一次会话过程中的一些信息,对应类型:javax.servlet.http.httpsession

out:负责管理对客户端的输出,对应类型:javax.serlvet.jsp.jspwriter

application:表示整个应用环境的信息,对应类型:javax.servlet.servletcontext

config:表示 ServletConfig,对应类型:javax.servlet.servletconfig

exception:表示页面中发生的异常,可以通过它获得页面异常信息,对应类型:java.lang.exception

pagecontext:表示这个 JSP 页面上下文,对应类型:javax.servlet.jsp.pagecontext

page:表示当前 JSP 页面本身。

2.6.2. JSP 的域对象

1、page 是代表一个页面相关的对象和属性。一个页面由一个编译好的 java servlet 类(可以带有 include 指令,但不可以带有 include 动作)表示。这既包括 servlet 又包括编译成 servlet 的 jsp 页面。

2、request 是代表与 web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 web组件(由于 forware 指令和 include 动作的关系)

3、session 是代表与用于某个 web 客户机的一个用户体验相关的对象和属性。一个 web 回话也可以经常跨域多个客户机请求。

4、application 是代表与整个 web 应用程序相关的对象和属性。这实质上是跨域整个 web 应用程序,包括多个页面、请求和回话的一个全局作用域。

2.6.3. JSP 中动态 include 和静态 include 的区别

静态 include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。

动态 include:语法:<jsp:include page="文件名">,能够自动检查被包含文件,当客户端对 JSP 文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。

2.6.4. 页面间对象传递的方法

requestsessionapplicationcookie

2.6.5. 我们在 web 应用开发过程中经常遇到输出某种编码的字符,如

iso-8859-1 等,如何输出一个某种编码的字符串

tomcat 默认编码格式 ISO-8859-1,如果需要转码,需要按照 ISO-8859-1 将字符串还原成字节数组,再指定编码格

式转换为字符串;

public String Translate(String str)

{

String s="";

try{

s=new String(str.getBytes("iso-8859-1"),"UTF-8");

s=str.trim();

}catch(Exception e){

System.err.println(e.getMessage());

}

return s;

}

2.6.6. 如何防止表单重复提交

使用 session 技术:

1、在 regist.jsp 页面中生成一个为一个随机值,将其保存到 session 中,同时将其保存为表单的隐藏域的值。

2、在处理注册的请求时,获取 session 中的值,获取请求参数的值,比较两者是否相同,如果相同说明不是重复

提交,请求通过同时删除 session 中保存的的值,如果不相同则是重复提交,不能通过。

3、在前端做控制,表单提交后,没有 response,按钮不可重复点击,禁止刷新(前端和 app 都可将按钮,设置为disable);

2.6.7. 如何从 form 表单中获取 checkbox 的值

可以在页面将 checkbox name 属性设置相同,value 属性取每个条目的 id,在后台使用 request.getParametervalues"name";获取一组值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值