gpt4 book ai didi

java - 是否有 "heavy class"这样的东西?它的正确定义是什么?

转载 作者:行者123 更新时间:2023-12-02 01:33:43 25 4
gpt4 key购买 nike

我发现一些类(“重类”)不应该重复创建和处置,因为它占用了 JVM 的开销/时间/资源。虽然可以想象什么是重级 - 我从未遇到过它的任何定义。

背景:

  • 重复创建和处置 SimpleDateFormat 来转换日期被视为一种不好的做法。 SimpleDateFormat 不是线程安全的,我不赞成在 Web 环境中同步它。

所以:

  • “重磅级”有正确的定义吗?

更新

我不认为“重类”有任何定义。如果您能提出任何定义 - 我很乐意投票...

同时,我创建了一个测试来了解 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." );
}
}

得分:

Start: total mem: 32505856, freeMemory: 31597048, maxMemory: 59768832
Duration: 25568 miliseconds Created 10000000 and disposed of: 10000000 objects
Average time of creating + disposing time: 391113.8923654568 objects per second.

最佳答案

我认为这个相当模糊的术语没有一个真正普遍接受的定义,所以我会给你我自己的定义:任何在分析器中(或更多手动测量)显示为重大性能问题的类.

我发现 Calendar 类在一个用例中占用了 10% 的 CPU 资源,将其集中起来会产生很大的差异。我见过启用和不启用无状态 session Bean 池的应用程序服务器,并且池产生了显着的差异。我见过 XML 解析器,其中汇集相关类会产生很大的差异 (18%)。这些都是很好的例子。这并不意味着我总是池化日历实例;我这样做是为了那些能产生影响的应用程序。对象本身不一定总是“重”,但在某些应用程序的某些情况下可能会很“重”。

因此,简而言之,“重级”是指可以衡量为具有重大影响且池化发挥作用的类别。符合要求的类将取决于您的应用程序及其使用方式。

关于java - 是否有 "heavy class"这样的东西?它的正确定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55569840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com