我发现有些类(“重类”)不应该重复创建和处理,因为它也需要JVM的开销/时间/资源。虽然可以想象什么是重型 - 我从来没有遇到过它的任何定义。
背景:
所以:
UPDATE
我没有想到任何“重阶级”的定义。如果你能提出任何定义 - 我很高兴赞成...
同时我创建了一个测试,以了解JVM创建和处理SimpleDateFormat对象需要多长时间。在我的i7盒子上,我创建并处理了390-400千个对象(使用堆内存限制64Mb,-Xms32m -Xmx64m运行):
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicLong;
public class SdfTest {
static AtomicLong created = new AtomicLong(0L);
static AtomicLong disposed = new AtomicLong(0L);
public static class SimpleDateFormat2 extends SimpleDateFormat {
private static final long serialVersionUID = 1L;
public SimpleDateFormat2() {
created.incrementAndGet();
}
@Override
protected void finalize() throws Throwable {
disposed.incrementAndGet();
super.finalize();
}
}
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
System.out.format("Start: total mem: %d, freeMemory: %d, maxMemory: %d%n",
rt.totalMemory(), rt.freeMemory(), rt.maxMemory());
LocalDateTime start = LocalDateTime.now();
for (int i = 0; i < 10_000_000; i++) {
new SimpleDateFormat2();
}
System.gc();
LocalDateTime stop = LocalDateTime.now();
Long durationMs = Duration.between(start, stop).toMillis();
System.out.println("Duration: " + durationMs + " miliseconds");
System.out.println("Created " + created + " and disposed of: " + disposed + " objects.");
System.out.println("Average time of creating + disposing time: " + 1000 *
( (double) disposed.get() / durationMs) + " objects per second." );
}
}
得分:
开始:总记忆:32505856,freeMemory:31597048,maxMemory:59768832 持续时间:25568毫秒创建10000000并处理:10000000个对象 创建+处置时间的平均时间:每秒391113.8923654568个对象。
我不认为对于这个相当含糊的术语有一个真正普遍接受的定义,所以我会给你我自己的:任何出现在剖析器(或更多手动测量)中的类作为重要的性能问题。
我已经看到Calendar类将10%的CPU资源用于一个用例,汇集它会产生很大的不同。我已经看到了启用和不启用无状态会话bean池的应用程序服务器,并且池产生了可测量的差异。我见过XML解析器,其中相关类的汇集产生了很大的差异(18%)。这些都是很好的例子。这并不意味着我总是汇集日历实例;我为那些有所作为的应用程序做到这一点。对象本身不一定总是“重”,但在某些情况下可能适用于某些应用程序。
因此,简而言之,“重型”是指可以衡量其具有重大影响并且汇集有所作为的“重型”。适合该法案的类将取决于您的应用程序及其使用方式。