1.线程池优化
acceptCount:accept队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。默认值是100
maxConnections:Tomcat在任意时刻接收和处理的最大连接数。maxThreads的设置既与应用的特点有关,也与服务器的CPU核心数量有关。通过前面介绍可以知道,maxThreads数量应该远大于CPU核心数量;而且CPU核心数越大,maxThreads应该越大;应用中CPU越不密集(IO越密集),maxThreads应该越大,以便能够充分利用CPU。当然,maxThreads的值并不是越大越好,如果maxThreads过大,那么CPU会花费大量的时间用于线程的切换,整体效率会降低。
maxThreads:请求处理线程的最大数量。默认值是200
2.jvm内存优化
jvm内存模型:
方法区:JDK 1.8中 PermSize 和 MaxPermGen 已经无效
虚拟机栈:对象引用,一般是不用调整的,使用默认即可
本地方法栈:Native方法对象引用,一般是不用调整的,使用默认即可
堆 :堆则是整个JVM调优的重点
Young(年轻代):
1、绝大多数新建的 Object 被放在 Eden Memory
2、如果 Eden Memory 内存满了,则进行 GC 操作。
同时把未被 GC 的 Object 移动到 S1或 S2 中。
此时 Minor GC 也会检查和移动 S1和 S2 中的对象。
最后使 S1,S2 其中一个置为空。
3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。
通常 Object 会被 GC 设定一个轮询的阀值。
4、Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。
与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。
耗用的时间也相对较长。
5、JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据
(application metadata),用来描述类及其方法的原始信息。
注意:Perm Gen 不是 Heap 的一部分。
Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。
Perm Gen 中同时包括 Java SE 包中的类。
Perm Gen 只有在执行 Full GC 时才会被 GC。
-Xms:设置初始分配大小,默认为物理内存的“1/64”
-Xmx:最大分配内存,默认为物理内存的“1/4”
堆内存可伸缩区,就可能造成程序性能下降;所以,我最好能让伸缩区的大小为0;即让 Max_memory 和 Total_memory 保持一致;
调优方法
一切都是为了这一步,调优,在调优之前,我们需要记住下面的原则:
1、多数的Java应用不需要在服务器上进行GC优化;
2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
3、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
4、减少创建对象的数量;
5、减少使用全局变量和大对象;
6、GC优化是到最后不得已才采用的手段;
7、在实际使用中,分析GC情况优化代码比优化GC参数要多得多;
内存溢出的解决办法:
1、通过命令jmap -histo pid获取JVM内存里面对象数量及相同对象的内存使用情况
2、grep ‘’ . -r命令查找在编译好的类中有哪些类使用了占用内存异常的对象,
3、找到对应的类,具体分析代码。
linux优化:
系统允许当前用户进程打开的文件数量的限制: ulimit -u 默认值为1024 。即是Linux操作系统对一个进程打开的文件句柄数量的限制
对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。