有没有“重阶级”这样的事情。什么是正确的定义?

问题描述 投票:0回答:1

我发现有些类(“重类”)不应该重复创建和处理,因为它也需要JVM的开销/时间/资源。虽然可以想象什么是重型 - 我从来没有遇到过它的任何定义。

背景:

  • 反复创建和处理SimpleDateFormat以实现日期融合被视为一种不好的做法。 SimpleDateFormat不是线程安全的,我不赞成在Web环境中同步它。

所以:

  • 是否有“重阶级”的正确定义?

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个对象。

java spring heavy-class
1个回答
2
投票

我不认为对于这个相当含糊的术语有一个真正普遍接受的定义,所以我会给你我自己的:任何出现在剖析器(或更多手动测量)中的类作为重要的性能问题。

我已经看到Calendar类将10%的CPU资源用于一个用例,汇集它会产生很大的不同。我已经看到了启用和不启用无状态会话bean池的应用程序服务器,并且池产生了可测量的差异。我见过XML解析器,其中相关类的汇集产生了很大的差异(18%)。这些都是很好的例子。这并不意味着我总是汇集日历实例;我为那些有所作为的应用程序做到这一点。对象本身不一定总是“重”,但在某些情况下可能适用于某些应用程序。

因此,简而言之,“重型”是指可以衡量其具有重大影响并且汇集有所作为的“重型”。适合该法案的类将取决于您的应用程序及其使用方式。

© www.soinside.com 2019 - 2024. All rights reserved.