如何挖掘出 Java 线程和同步设施的最大性能


1 线程池与 ThreadPollExecutor

Java EE 应用服务器就是围绕用一个或多个线程池处理请求这一概念构建的:对服务器上 Servlet 的每个调用都是通过池中的线程处理的(也有可能不同)。类似的,其它应用可以使用 Java 的 ThreadPoolExecutor 并行执行任务。

阅读全文 »

0 CPU 使用率

使用 vmstat 命令查看 CPU 使用率,即 us\sy\id 三个参数,用户、系统、空闲使用 CPU 的时间。

  1. 检查应用性能时,首先应该审查 CPU 时间(尤其是多线程,CPU 的上下文切换报告)
  2. 优化代码的目的是提升而不是降低(更短时间段内的)CPU 使用率。
  3. 在试图深入优化应用前,应该先弄清楚为何 CPU 使用率低。
阅读全文 »

很多时候,我们没有机会重写代码,又要面临需要提高 Java 应用性能的压力,这种情况下对垃圾收集器的调优就变得至关重要。

  1. Serial 收集器(常用于单 CPU环境)。
  2. Throughput(或者 Parallel)收集器。
  3. Concurrent 收集器(CMS)。
  4. G1 收集器。

1 垃圾收集概述

阅读全文 »

1 原则1:测试真实应用

应该在产品实际使用的环境中进行性能测试。

1.1 微基准测试

1. 必须使用被测的结果

例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void doTest() {
int nLoops = 50;
double l;
long then = System.currentTimeMillis();
for (int i = 0; i < nLoops; i++) {
l = fibImpl1(50);
}
long now = System.currentTimeMillis();
System.out.println("Elapsed time:" + (now - then));
}

private double fibImpl1(int n) {
if (n < 0) throw new IllegalArgumentException("Must be > 0");
if (n == 0) return 0d;
if (n == 1) return 1d;
double d = fibImpl1(n - 2) + fibImpl1(n - 1);
if (Double.isInfinite(d)) throw new ArithmeticException("Overflow");
return d;
}

阅读全文 »