面试笔录--jvm调优(常问)

因为我们的项目,web服务器中间件都用的是Tomcat,所以jvm的调优一般都是针对Tomcat的调优。调优工具可以可以借用jdk自带的VisualVM工具,到JDK安装目录/bin目录下,双击jvisualvm.exe文件,直接启动,就可以查看到当前的堆空间大小分配情况、线程监控情况和垃圾回收监控等。根据这些信息,再进行相应的调整。

我觉的Jvm调优的重点就是垃圾回收(gc,garbage collection)和内存管理。垃圾回收的时候会导致,整个虚拟机暂停服务。因此,应该尽可能地缩短垃圾回收的处理时间。

Java中垃圾回收机制是jvm自动完成的,我们不用操作,但可以通过修改一些配置对他进行影响;

首先可以开启server模式,这样虽
然启动慢点,但是长期运行效率高;(修改%JAVA_HOME%/jre/lib/i386/jvm.cfg文件开启)
2、针对JVM堆的设置,JVM初始堆内存分配有-Xms指定,默认是物理内存的1/64;

最大分配堆内存有-Xmx指定,默认是物理内存的1/4;当堆内存小于40%时,JVM就会自动增加,直到最大值。当空余堆内存大于70%时,JVM就会自动减少,直到最小值。因此,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值;

3、配置年轻代(Xmn)的值,持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

4、设置个线程的堆栈大小Xss,每个线程默认堆栈大小为1M,可根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数也是有限制的,不能无限生成,经验值在3000~5000左右。

5、回收器的选择,JVM给了三种选择:串行收集器、并行收集器、并发收集器,JVM会根据当前系统配置进行判断,自动选择。但我们可以对一些参数进行设置。串行收集器只适用于小数据量的情况,一般不用处理;可以配置年轻代使用并发收集器,老年代使用并行收集器;如果响应时间有限,就选择并发收集器,尽可能设大年轻代;

如果吞吐量优先就选择并行收集器,也尽可能设大年轻代;

6、禁用Tomcat的DNS查询。(当 Web 应用程序记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址。 DNS 查询需要占用网络,并且可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP, 这样会消耗一定的时间。为了消除 DNS 查询对性能的影响,可以关闭 DNS 查询。方法是修改 server.xml 文件中的 enableLookups 参数值。)

7、线程数配置:Tomcat连接数过大可能引起的死机。所以,可以根据并发量在Tomcat的server.xml中修改他的最大线程数、初始化线程数等参数。(一般也就估计这配置,小了就配大点。也没有具体评估过)

我们在项目中,一般也就是项目出现问题以后,再去优化。Tomcat在年老代溢出(java.lang.OutOfMemoryError: Java heap space)、持久代溢出(java.lang.OutOfMemoryError: PermGen space)、堆栈溢出(java.lang.StackOverflowError)、线程溢出(Fatal: Stack size too smal)、内存溢出(java.lang.OutOfMemoryError: unable to create new native thread)是会抛出不同溢出。根据溢出去进行修改。

你可能感兴趣的:(jvm)