【Java 架构师面试网】收集整理了一些 Java 面试的常见问题,这些问题可能会在你下一次技术面试中遇到。想成为 Java 架构师,这些都是不可避免也是必须要把握的哦,对于其余模块的面试题,我后续也将独自分享面试问题和答案。成为 Java 架构师的这条路道阻且艰,然而既然抉择了远方就是抉择了风雨兼程,心愿大家都能早日圆本人的架构师梦,同样也心愿我本人能够,除了网站,还做了个公众号:Java 架构师面试网,关注并加交换群即可取得我给你筹备的精美面试礼包哦~
1、Tomcat 的缺省端口是多少,怎么批改?
1)找到 Tomcat 目录下的 conf 文件夹
2)进入 conf 文件夹外面找到 server.xml 文件
3)关上 server.xml 文件
4)在 server.xml 文件外面找到下列信息
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
port=”8080″ 改成你想要的端口
2、tomcat 有哪几种 Connector 运行模式 (优化)?
bio:传统的 Java I/O 操作,同步且阻塞 IO。
maxThreads=”150”//Tomcat 应用线程来解决接管的每个申请。这个值示意 Tomcat 可创立的最大的线程数。默认值 200。能够依据机器的期间性能和内存大小调整,个别能够在 400-500。最大能够在 800 左右。
minSpareThreads=”25”—Tomcat 初始化时创立的线程数。默认值 4。如果以后没有闲暇线程,且没有超过 maxThreads,一次性创立的闲暇线程数量。
Tomcat 初始化时创立的线程数量也由此值设置。maxSpareThreads=”75”–一旦创立的线程超过这个值,Tomcat 就会敞开不再须要的 socket 线程。默认值 50。一旦创立的线程超过此数值,Tomcat 会敞开不再须要的线程。线程数能够大抵上用“同时在线人数每秒用户操作次数零碎均匀操作工夫”来计算。
acceptCount=”100”—- 指定当所有能够应用的解决申请的线程数都被应用时,能够放到解决队列中的申请数,超过这个数的申请将不予解决。默认值 10。如果以后可用线程数为 0,则将申请放入解决队列中。这个值限定了申请队列的大小,超过这个数值的申请将不予解决。
connectionTimeout=”20000”–网络连接超时,默认值 20000,单位:毫秒。设置为 0 示意永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
nio:JDK1.4 开始反对,同步阻塞或同步非阻塞 IO。
指定应用 NIO 模型来承受 HTTP 申请
protocol=”org.apache.coyote.http11.Http11NioProtocol”指定应用 NIO 模型来承受 HTTP 申请。默认是 BlockingIO,配置为 protocol=”HTTP/1.1”
acceptorThreadCount=”2”应用 NIO 模型时接管线程的数目 aio(nio.2):JDK7 开始反对,异步非阻塞 IO。
apr:Tomcat 将以 JNI 的模式调用 Apache HTTP 服务器的外围动态链接库来解决文件读取或网络传输操作,从而大大地 进步 Tomcat 对动态文件的解决性能。
<!--
<Connector connectionTimeout="20000" port="8000"
protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
-->
<!-- protocol 启用 nio 模式,(tomcat8 默认应用的是 nio)(apr 模式利用零碎级异步 io) -->
<!-- minProcessors 最小闲暇连接线程数 -->
<!-- maxProcessors 最大连接线程数 -->
<!-- acceptCount 容许的最大连接数,应大于等于 maxProcessors-->
<!-- enableLookups 如果为 true,requst.getRemoteHost 会执行 DNS 查找,反向解析 ip 对应域名或主机名 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443 maxThreads=“500”minSpareThreads=“100”maxSpareThreads=“200”acceptCount="200"enableLookups="false"/>
其余配置
maxHttpHeaderSize=”8192″ http 申请头信息的最大水平,超过此长度的局部不予解决。个别 8K。
URIEncoding=”UTF-8″ 指定 Tomcat 容器的 URL 编码格局。disableUploadTimeout=”true” 上传时是否应用超时机制 enableLookups=”false”– 是否反查域名,默认值为 true。为了进步解决能力,应设置为 false compression=”on” 关上压缩性能 compressionMinSize=”10240″ 启用压缩的输入内容大小,默认为 2KB
noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启用压缩
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
3、Tomcat 有几种部署形式?
1)间接把 Web 我的项目放在 webapps 下,Tomcat 会主动将其部署
2)在 server.xml 文件上配置 <Context> 节点,设置相干的属性即可
3)通过 Catalina 来进行配置: 进入到 confCatalinalocalhost 文件下,创立一个 xml 文件,该文件的名字就是站点的名字。编写 XML 的形式来进行设置。
4、tomcat 容器是如何创立 servlet 类实例?用到了什么原理?
当容器启动时,会读取在 webapps 目录下所有的 web 利用中的 web.xml 文件,而后对 xml 文件进行解析,并读取 servlet 注册信息。而后,将每个利用中注册的 servlet 类都进行加载,并通过反射的形式实例化。
(有时候也是在第一次申请时实例化)在 servlet 注册时加上如果为负数,则在一开始就实例化,如果不写或为正数,则第一次申请实例化。
5.tomcat 如何优化?
1、优化连贯配置. 这里以 tomcat7 的参数配置为例,须要批改 conf/server.xml 文件,批改连接数,敞开客户端 dns 查问。
参数解释:
URIEncoding=”UTF-8″ : 使得 tomcat 能够解析含有中文名的文件的 url,真不便,不像 apache 里还有搞个 mod_encoding,还要手工编译 maxSpareThreads : 如果闲暇状态的线程数多于设置的数目,则将这些线程停止,缩小这个池中的线程总数。
minSpareThreads : 最小备用线程数,tomcat 启动时的初始化的线程数。
enableLookups : 这个效用和 Apache 中的 HostnameLookups 一样,设为敞开。
connectionTimeout : connectionTimeout 为网络连接超时工夫毫秒数。
maxThreads : maxThreads Tomcat 应用线程来解决接管的每个申请。这个值示意 Tomcat 可创立的最大的线程数,即最大并发数。
acceptCount : acceptCount 是当线程数达到 maxThreads 后,后续申请会被放入一个期待队列,这个 acceptCount 是这个队列的大小,如果这个队列也满了,就间接 refuse connection maxProcessors 与 minProcessors : 在 Java 中线程是程序运行时的门路,是在一个程序中与其它控制线程无关的、可能独立运行的代码段。它们共享雷同的地址空间。多线程帮忙程序员写出 CPU 最 大利用率的高效程序,使闲暇工夫放弃最低,从而承受更多的申请。
通常 Windows 是 1000 个左右,Linux 是 2000 个左右。
useURIValidationHack: 咱们来看一下 tomcat 中的一段源码:
【security】if (connector.getUseURIValidationHack()) {String uri = validate(request.getRequestURI());
if (uri == null) {res.setStatus(400);
res.setMessage(“Invalid URI”);
throw new IOException(“Invalid URI”);
} else {req.requestURI().setString(uri);
// Redoing the URI decoding
req.decodedURI().duplicate(req.requestURI());
req.getURLDecoder().convert(req.decodedURI(), true);
能够看到如果把 useURIValidationHack 设成”false”,能够缩小它对一些 url 的不必要的查看从而减省开销。
enableLookups=”false”:为了打消 DNS 查问对性能的影响咱们能够敞开 DNS 查问,形式是批改 server.xml 文件中的 enableLookups 参数值。
disableUploadTimeout:相似于 Apache 中的 keeyalive 一样给 Tomcat 配置 gzip 压缩 (HTTP 压缩) 性能
compression=”on”compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/JavaScript,text/css,text/plain”
HTTP 压缩能够大大提高浏览网站的速度,它的原理是,在客户端申请网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解
压缩并浏览。绝对于一般的浏览过程 HTML,CSS,javascript , Text,它能够节俭 40% 左右的流量。更为重要的是,它能够对动静生成的,包含 CGI、PHP ,JSP , ASP , Servlet,SHTML 等输入的网页也能进行压缩,压缩效率惊人。
1)compression=”on”关上压缩性能
2)compressionMinSize=”2048″ 启用压缩的输入内容大小,这外面默认为 2KB
3)noCompressionUserAgents=”gozilla, traviata”对于以下的浏览器,不启用压缩
4)compressableMimeType=”text/html,text/xml”压缩类型最初不要忘了把 8443 端口的中央也加上同样的配置,因为如果咱们走 https 协定的话,咱们将会用到 8443 端口这个段的配置,对吧?
<!–enable tomcat ssl–>
<Connector port=”8443″ protocol=”HTTP/1.1″
URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false”disableUploadTimeout=”true”connectionTimeout=”20000″
acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″
minProcessors=”5″
useURIValidationHack=”false”compression=”on”compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”SSLEnabled=”true”scheme=”https”secure=”true”clientAuth=”false”sslProtocol=”TLS”keystoreFile=”d:/tomcat2/conf/shnlap93.jks”keystorePass=”aaaaaa”/>
好了,所有的 Tomcat 优化的中央都加上了。
6. 内存调优
内存形式的设置是在 catalina.sh 中,调整一下 JAVA_OPTS 变量即可,因为前面的启动参数会把 JAVA_OPTS 作为 JVM 的启动参数来解决。
具体设置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -
XX:NewRatio=4 -XX:SurvivorRatio=4"
其各项参数如下:
-Xmx3550m:设置 JVM 最大可用内存为 3550M。
-Xms3550m:设置 JVM 促使内存为 3550m。此值能够设置与 -Xmx 雷同,以防止每次垃圾回收实现后 JVM 从新分配内存。
-Xmn2g:设置年老代大小为 2G。整个堆大小 = 年老代大小 + 年轻代大小 + 长久代大小。长久代个别固定大小为 64m,所以增大年老代后,将会减小年轻
代大小。此值对系统性能影响较大,Sun 官网举荐配置为整个堆的 3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0 当前每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。更具利用的线程所需内存大小进行调整。在雷同物理内存下,减小这个值能生成更多的线程。然而操作系统对一个过程内的线程数还是有限度的,不能有限生成,经验值在 3000~5000 左右。
-XX:NewRatio=4: 设置年老代(包含 Eden 和两个 Survivor 区)与年轻代的比值(除去长久代)。设置为 4,则年老代与年轻代所占比值为 1:4,年老代占整个堆栈的 1/5
-XX:SurvivorRatio=4:设置年老代中 Eden 区与 Survivor 区的大小比值。设置为 4,则两个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个年老代的 1/6
-XX:MaxPermSize=16m: 设置长久代大小为 16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年老代对象不通过 Survivor 区,间接进入年轻代。对于年轻代比拟多的利用,能够提高效率。如果将此值设置为一个较大值,则年老代对象会在 Survivor 区进行屡次复制,这样能够减少对象再年老代的存活工夫,减少在年老代即被回收的概论。
7. 垃圾回收策略调优
垃圾回收的设置也是在 catalina.sh 中,调整 JAVA_OPTS 变量。
具体设置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -
XX:+UseParallelGC -XX:MaxGCPauseMillis=100"
具体的垃圾回收策略及相应策略的各项参数如下:
串行收集器(JDK1.5 以前次要的回收形式)
-XX:+UseSerialGC: 设置串行收集器
并行收集器(吞吐量优先)
示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC –
XX:MaxGCPauseMillis=100
-XX:+UseParallelGC:抉择垃圾收集器为并行收集器。此配置仅对年老代无效。即上述配置下,年老代应用并发收集,而年轻代仍旧应用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年轻代垃圾收集形式为并行收集。JDK6.0 反对对年轻代并行收集
-XX:MaxGCPauseMillis=100: 设置每次年老代垃圾回收的最长工夫,如果无奈满足此工夫,JVM 会主动调整年老代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会主动抉择年老代区大小和相应的 Survivor 区比例,以达到目标零碎规定的最低相应工夫或者收集频率等,此值倡议应用并行收集器时,始终关上。
并发收集器(响应工夫优先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k –
XX:+UseConcMarkSweepGC-XX:+UseConcMarkSweepGC:设置年轻代为并发收集。测试中配置这个当前,-XX:NewRatio=4 的配置生效了,起因不明。所以,此时年老代大小最好用 -Xmn 设置。
-XX:+UseParNewGC: 设置年老代为并行收集。可与 CMS 收集同时应用。JDK5.0 以上,JVM 会依据系统配置自行设置,所以无需再设置此值。
-XX:CMSFullGCsBeforeCompaction:因为并发收集器不对内存空间进行压缩、整顿,所以运行一段时间当前会产生“碎片”,使得运行效率升高。此值设置运行多少次 GC 当前对内存空间进行压缩、整顿。
-XX:+UseCMSCompactAtFullCollection:关上对年轻代的压缩。可能会影响性能,然而能够打消碎片
8. 共享 session 解决
目前的解决形式有如下几种:
1). 应用 Tomcat 自身的 Session 复制性能
参考 http://ajita.iteye.com/blog/1…(Session 复制的配置)计划的有点是配置简略,毛病是当集群数量较多时,Session 复制的工夫会比
较长,影响响应的效率
2). 应用第三方来寄存共享 Session
目前用的较多的是应用 memcached 来治理共享 Session,借助于 memcached-sesson-manager 来进行 Tomcat 的 Session 治理参考 http://ajita.iteye.com/blog/1…(应用 MSM 治理 Tomcat 集群 session)
3). 应用黏性 session 的策略
对于会话要求不太强(不波及到计费,失败了容许从新申请下等)的场合,同一个用户的 session 能够由 nginx 或者 apache 交给同一个 Tomcat 来解决,这就是所谓的 session sticky 策略,目前利用也比拟多
参考:http://ajita.iteye.com/blog/1…(tomcat session sticky)nginx 默认不蕴含 session sticky 模块,须要从新编译才行
长处是解决效率高多了,毛病是强会话要求的场合不适合
8. 增加 JMS 近程监控
对于部署在局域网内其它机器上的 Tomcat,能够关上 JMX 监控端口,局域网其它机器就能够通过这个端口查看一些罕用的参数(但一些比较复杂的性能不反对),同样是在 JVM 启动参数中配置即可,配置如下:
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38 设置 JVM 的 JMS 监控监听的 IP 地址,次要是为了避免谬误的监听成 127.0.0.1 这个内网地址
-Dcom.sun.management.jmxremote.port=1090 设置 JVM 的 JMS 监控的端口
-Dcom.sun.management.jmxremote.ssl=false 设置 JVM 的 JMS 监控不实用 SSL
-Dcom.sun.management.jmxremote.authenticate=false 设置 JVM 的 JMS 监控不须要认证
9. 业余点的剖析工具有
IBM ISA,JProfiler、probe 等,具体监控及剖析形式去网上搜寻即可
10. 对于 Tomcat 的 session 数目
这个能够间接从 Tomcat 的 web 治理界面去查看即可;
或者借助于第三方工具 Lambda Probe 来查看,它绝对于 Tomcat 自带的治理略微多了点性能,但也不多;
11. 监督 Tomcat 的内存应用状况
应用 JDK 自带的 jconsole 能够比拟明了的看到内存的应用状况,线程的状态,以后加载的类的总量等;
JDK 自带的 jvisualvm 能够下载插件(如 GC 等),能够查看更丰盛的信息。
如果是剖析本地的 Tomcat 的话,还能够进行内存抽样等,查看每个类的应用状况
12. 打印类的加载状况及对象的回收状况
这个能够通过配置 JVM 的启动参数,打印这些信息(到屏幕(默认也会到
catalina.log 中)或者文件),具体参数如下:
-XX:+PrintGC:输入模式:[GC 118250K->113543K(130112K), 0.0094143secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails:输入模式:[GC [DefNew: 8614K->781K(9088K),0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC
[DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured:
112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K),0.0436268 secs]
-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可与下面两个混合应用,输入模式:11.851: [GC 98328K->93620K(130112K), 0.0082960secs]
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行工夫。可与下面混合应用。输入模式:Application time: 0.5291524seconds
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的工夫。可与下面混合应用。输入模式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:PrintHeapAtGC: 打印 GC 前后的具体堆栈信息
-Xloggc:filename: 与下面几个配合应用,把相干日志信息记录到文件以便剖析
-verbose:class 监督加载的类的状况
-verbose:gc 在虚拟机产生内存回收时在输出设备显示信息
-verbose:jni 输入 native 办法调用的相干状况,个别用于诊断 jni 调用错误信息
13.Tomcat 一个申请的残缺过程
Ng:(nginx)
upstream yy_001{
server 10.99.99.99:8080;
server 10.99.99.100:8080;
hash $**;
healthcheck_enabled;
healthcheck_delay 3000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: wo.com'
'Connection: close';
}
server {
include base.conf;
server_name wo.de.tian;
...
location /yy/ {proxy_pass http://yy_001;}
首先 dns 解析 wo.de.tian 机器,个别是 ng 服务器 ip 地址
而后 ng 依据 server 的配置,寻找门路为 yy/ 的机器列表,ip 和端口
最初 抉择其中一台机器进行拜访—-> 上面为具体过程
1) 申请被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/1.1Connector 取得
2) Connector 把该申请交给它所在的 Service 的 Engine 来解决,并期待来自 Engine 的回应
3) Engine 取得申请 localhost/yy/index.jsp,匹配它所领有的所有虚拟主机 Host
4) Engine 匹配到名为 localhost 的 Host(即便匹配不到也把申请交给该 Host 解决,因为该 Host 被定义为该 Engine 的默认主机)
5) localhost Host 取得申请 /yy/index.jsp,匹配它所领有的所有 Context
6) Host 匹配到门路为 /yy 的 Context(如果匹配不到就把该申请交给路径名为”“的 Context 去解决)
7) path=”/yy”的 Context 取得申请 /index.jsp,在它的 mapping table 中寻找对应的 servlet
8) Context 匹配到 URL PATTERN 为 *.jsp 的 servlet,对应于 JspServlet 类
9) 结构 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用 JspServlet 的 doGet 或 doPost 办法
10)Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
11)Host 把 HttpServletResponse 对象返回给 Engine
12)Engine 把 HttpServletResponse 对象返回给 Connector
13)Connector 把 HttpServletResponse 对象返回给客户 browser
14.Tomcat 工作模式?
Tomcat 是一个 JSP/Servlet 容器。其作为 Servlet 容器,有三种工作模式:独立的 Servlet 容器、过程内的 Servlet 容器和过程外的 Servlet 容器。
进入 Tomcat 的申请能够依据 Tomcat 的工作模式分为如下两类:
Tomcat 作为应用程序服务器:申请来自于前端的 web 服务器,这可能是 Apache, IIS, Nginx 等;
Tomcat 作为独立服务器:申请来自于 web 浏览器;
15. 你怎么给 tomcat 去调优?
- JVM 参数调优:-Xms<size> 示意 JVM 初始化堆的大小,-Xmx<size> 示意 JVM 堆的最大值。这两个值的大小个别依据须要进行设置。当应用程序须要的内存超出堆的最大值时虚拟机就会提醒内存溢出,并且导致应用服务解体。因而个别倡议堆的最大值设置为可用内存的最大值的 80%。在 catalina.bat 中,设置 JAVA_OPTS=’-Xms256m -Xmx512m’,示意初始化内存为 256MB,能够应用的最大内存为 512MB。
- 禁用 DNS 查问
当 web 应用程序向要记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址。DNS 查问须要占用网络,并且包含可能从很多很远的服务器或者不起作用的服务器下来获取对应的 IP 的过程,这样会耗费肯定的工夫。为了打消 DNS 查问对性能的影响咱们能够敞开 DNS 查问,形式是批改 server.xml 文件中的 enableLookups 参数值:
Tomcat4
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80"
minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />
Tomcat5
<Connector port="80" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
disableUploadTimeout="true"/>
- 调整线程数
通过应用程序的连接器(Connector)进行性能管制的的参数是创立的解决申请的线程数。Tomcat 应用线程池减速响应速度来解决申请。在 Java 中线程是程序运行时的门路,是在一个程序中与其它控制线程无关的、可能独立运行的代码段。它们共享雷同的地址空间。多线程帮忙程序员写出 CPU 最大利用率的高效程序,使闲暇工夫放弃最低,从而承受更多的申请。
Tomcat4 中能够通过批改 minProcessors 和 maxProcessors 的值来控制线程数。这些值在装置后就曾经设定为默认值并且是足够应用的,然而随着站点的扩容而改大这些值。
minProcessors 服务器启动时创立的解决申请的线程数应该足够解决一个小量的负载。也就是说,如果一天内每秒仅产生 5 次单击事件,并且每个申请工作解决须要 1 秒钟,那么事后设置线程数为 5 就足够了。但在你的站点访问量较大时就须要设置更大的线程数,指定为参数 maxProcessors 的值。maxProcessors 的值也是有下限的,应避免流量不可管制(或者歹意的服务攻打),从而导致超出了虚拟机应用内存的大小。如果要加大并发连接数,应同时加大这两个参数。web server 容许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右,Linux 是 1000 个左右。
在 Tomcat5 对这些参数进行了调整,请看上面属性:maxThreads Tomcat 应用线程来解决接管的每个申请。这个值示意 Tomcat 可创立的最大的线程数。
acceptCount 指定当所有能够应用的解决申请的线程数都被应用时,能够放到解决队列中的申请数,超过这个数的申请将不予解决。
connnectionTimeout 网络连接超时,单位:毫秒。设置为 0 示意永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
minSpareThreads Tomcat 初始化时创立的线程数。
maxSpareThreads 一旦创立的线程超过这个值,Tomcat 就会敞开不再须要的 socket 线程。
最好的形式是多设置几次并且进行测试,察看响应工夫和内存应用状况。在不同的机器、操作系统或虚拟机组合的状况下可能会不同,而且并不是所有人的 web 站点的流量都是一样的,因而没有一刀切的计划来确定线程数的值。
16. 如何加大 tomcat 连接数
在 tomcat 配置文件 server.xml 中的 <Connector /> 配置中,和连接数相干的参数有:
minProcessors:最小闲暇连接线程数,用于进步零碎解决性能,默认值为 10
maxProcessors:最大连接线程数,即:并发解决的最大申请数,默认值为 75
acceptCount:容许的最大连接数,应大于等于 maxProcessors,默认值为 100
enableLookups:是否反查域名,取值为:true 或 false。为了进步解决能力,应设置为 false
connectionTimeout:网络连接超时,单位:毫秒。设置为 0 示意永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
其中和最大连接数相干的参数为 maxProcessors 和 acceptCount。如果要加大并发连接数,应同时加大这两个参数。
web server 容许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右,Linux 是 1000 个左右。tomcat5 中的配置示例:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
对于其余端口的侦听配置,以此类推。3. tomcat 中如何禁止列目录下的文件
在{tomcat_home}/conf/web.xml 中,把 listings 参数设置成 false 即可,如下:<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
17. 怎么加大 tomcat 的内存。
首先检查程序有没有限入死循环
这个问题次要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的。第一次呈现这样的的问题当前,引发了其余的问题。在网上一查可能是 JAVA 的堆栈设置太小的起因。
跟据网上的答案大抵有这两种解决办法:
1、设置环境变量
解决办法:手动设置 Heap size
批改 TOMCAT_HOME/bin/catalina.sh
set JAVA_OPTS= -Xms32m -Xmx512m
能够依据本人机器的内存进行更改。
2、java -Xms32m -Xmx800m className
就是在执行 JAVA 类文件时加上这个参数,其中 className 是须要执行确实类名。(包含包名)
这个解决问题了。而且执行的速度比没有设置的时候快很多。
如果在测试的时候可能会用 Eclispe 这时候就须要在 Eclipse ->run -arguments 中的 VM arguments 中输出 -Xms32m -Xmx800m 这个参数就能够了。
起初在 Eclilpse 中批改了启动参数,在 VM arguments 退出了 -Xms32m -Xmx800m,问题解决。
一、java.lang.OutOfMemoryError: PermGen space
PermGen space 的全称是 Permanent Generation space, 是指内存的永恒保留区域, 这块内存次要是被 JVM 寄存 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中, 它和寄存类实例 (Instance) 的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space 进行清理,所以如果你的利用中有很多 CLASS 的话, 就很可能呈现 PermGen space 谬误, 这种谬误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm 默认的大小 (4M) 那么就会产生此错误信息了。
解决办法:手动设置 MaxPermSize 大小
批改 TOMCAT_HOME/bin/catalina.sh 在“echo “Using CATALINA_BASE: $CATALINA_BASE””下面退出以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
倡议:将雷同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这样能够达到缩小 jar 文档反复占用内存的目标。
二、java.lang.OutOfMemoryError: Java heap spaceHeap size 设置
JVM 堆的设置是指 java 程序运行过程中 JVM 能够调配应用的内存空间的设置.JVM 在启动的时候会主动设置 Heap size 的值,
其初始空间 (即 -Xms) 是物理内存的 1/64,最大空间 (-Xmx) 是物理内存的 1/4。能够利用 JVM 提供的 -Xmn -Xms -Xmx 等选项可进行设置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。
提醒:在 JVM 中如果 98%的工夫是用于 GC 且可用的 Heap size 有余 2%的时候将抛出此异样信息。
提醒:Heap Size 最大不要超过可用物理内存的 80%,个别的要将 -Xms 和 -Xmx 选项设置为雷同,而 Xmn 为 1/4 的 -Xmx 值。
解决办法:手动设置 Heap size
批改 TOMCAT_HOME/bin/catalina.sh
在“echo “Using CATALINA_BASE: $CATALINA_BASE””下面退出以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、实例,以下给出 1G 内存环境下 java jvm 的参数设置参考:
JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m –
XX:MaxPermSize=128m -Djava.awt.headless=true “
很大的 web 工程,用 tomcat 默认调配的内存空间无奈启动,如果不是在 myeclipse 中启动 tomcat 能够对 tomcat 这样设置:
TOMCAT_HOME/bin/catalina.bat 中增加这样一句话:
set JAVA_OPTS=-server -Xms2048m -Xmx4096m -XX:PermSize=512M –
XX:MaxPermSize=1024M -Duser.timezone=GMT+08
或者
set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
如果要在 myeclipse 中启动,上述的批改就不起作用了,可如下设置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的 Optional Java VM arguments 中增加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
以上是转贴,但自己遇见的问题是:在 myeclipse 中启动 Tomcat 时,提醒 ”ava.lang.OutOfMemoryError:
Java heap space”,解决办法就是:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的 Optional Java VM arguments 中增加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
18.Tomcat 有几种部署形式
tomcat 中四种部署我的项目的办法
第一种办法:
在 tomcat 中的 conf 目录中,在 server.xml 中的,<host/> 节点中增加:
<Context path="/hello" docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot" debug="0" privileged="true">
</Context>
至于 Context 节点属性,可具体见相干文档。
第二种办法:
将 web 我的项目文件件拷贝到 webapps 目录中。
第三种办法:
很灵便,在 conf 目录中,新建 Catalina(留神大小写)\localhost 目录,在该目录中新建一个 xml 文件,名字能够随便取,只有和以后文件中的文件名不反复就行了,该 xml 文件的内容为:
<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" debug="0" privileged="true">
</Context>
第 3 个办法有个长处,能够定义别名。服务器端运行的项目名称为 path,内部拜访的 URL 则应用 XML 的文件名。这个办法很不便的暗藏了我的项目的名称,对一些项目名称被固定不能更换,但内部拜访时又想换个门路,十分无效。第 2、3 还有长处,能够定义一些共性配置,如数据源的配置等。
第四种方法,:
能够用 tomcat 在线后盾管理器, 个别 tomcat 都关上了, 间接上传 war 就能够
19.Tomcat 的优化教训。
Tomcat 作为 Web 服务器,它的解决性能间接关系到用户体验,上面是几种常见的优化措施:
去掉对 web.xml 的监督,把 jsp 提前编辑成 Servlet。有充裕物理内存的状况,加大 tomcat 应用的 jvm 的内存。
服务器资源
服务器所能提供 CPU、内存、硬盘的性能对解决能力有决定性影响。
o 对于高并发状况下会有大量的运算,那么 CPU 的速度会间接影响到处理速度。
o 内存在大量数据处理的状况下,将会有较大的内存容量需要,能够用 -Xmx -Xms -XX:MaxPermSize 等参数对内存不同功能块进行划分。咱们之前就遇到过内存调配有余,导致虚拟机始终处于 full GC,从而导致解决能力重大降落。
o 硬盘次要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的方法还是利用上面提到的缓存。
利用缓存和压缩对于动态页面最好是可能缓存起来,这样就不用每次从磁盘上读。这里咱们采纳了 Nginx 作为缓存服务器,将图片、css、js 文件都进行了缓存,无效的缩小了后端 tomcat 的拜访。另外,为了能放慢网络传输速度,开启 gzip 压缩也是必不可少的。但思考到 tomcat 曾经须要解决很多货色了,所以把这个压缩的工作就交给前端的 Nginx 来实现。除了文本能够用 gzip 压缩,其实很多图片也能够用图像处理工具事后进行压缩,找到一个平衡点能够让画质损失很小而文件能够减小很多。已经我就见过一个图片从 300 多 kb 压缩到几十 kb,本人简直看不出来区别。
采纳集群
单个服务器性能总是无限的,最好的方法天然是实现横向扩大,那么组建 tomcat 集群是无效晋升性能的伎俩。咱们还是采纳了 Nginx 来作为申请分
流的服务器,后端多个 tomcat 共享 session 来协同工作。能够参考之前写的《利用 nginx+tomcat+memcached 组建 web 服务器负载平衡》。
优化 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" />
嗨,你好呀,将来的架构师,本文由 Java 架构师面试网 www.javajiagoushi.com 收集整理并进行编辑公布,谢谢大家的反对~