Memory Groovy应用程序有数千个NumberAreComparator实例?

Memory Groovy应用程序有数千个NumberAreComparator实例?,memory,groovy,Memory,Groovy,我正在运行一个IO密集型应用程序,当我运行jvisualvm profiler时,我看到NumberWareComparator占用了33%的内存和55%的所有对象 这正常吗?为什么会这样?我可以从哪里着手解决这个问题 /*更高版本-代码示例*/ //Using GPars (0..length - 1).eachParallel { i -> def final h = [:] distHash[i] = h

我正在运行一个IO密集型应用程序,当我运行jvisualvm profiler时,我看到NumberWareComparator占用了33%的内存和55%的所有对象

这正常吗?为什么会这样?我可以从哪里着手解决这个问题

/*更高版本-代码示例*/

//Using GPars
(0..length - 1).eachParallel { i ->
                def final h = [:]
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        def d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }
//使用gpar
(0..length-1).eachParallel{i->
def最终h=[:]
distHash[i]=h
println(“计算距离”)
如果(i+1<长度-1){
((i+1)…长度-1)。每个{j->
def d=距离计算距离(第[i]段、第[j]段)
如果(d<0.25){
h[j]=d
}
}
}
}
谢谢


我想我有一些解释,但我还是不确定机械原理。 我有一个做一些基本数值计算的函数,当它运行时,我有许多NumberWareComarator的实例:

(0..length - 1).eachParallel { i ->
                def final h = [:]
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        def d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }
(0..length-1).eachParallel{i->
def最终h=[:]
distHash[i]=h
println(“计算距离”)
如果(i+1<长度-1){
((i+1)…长度-1)。每个{j->
def d=距离计算距离(第[i]段、第[j]段)
如果(d<0.25){
h[j]=d
}
}
}
}
一旦我为每个变量声明了类型(如下所示),所有的比较器都消失了,并被float/int替换

(0..length - 1).eachParallel { i ->
                final LinkedHashMap<Integer, Float> h = new LinkedHashMap<Integer, Float>()
                distHash[i] = h

                println("Calculating distances ")

                if (i + 1 < length - 1) {
                    ((i + 1)..length - 1).each {j ->
                        float d = distanceCalc.getDistance(paragraphs[i], paragraphs[j])
                        if (d < 0.25) {
                            h[j] = d
                        }
                    }
                }
            }
(0..length-1).eachParallel{i->
final LinkedHashMap h=新LinkedHashMap()
distHash[i]=h
println(“计算距离”)
如果(i+1<长度-1){
((i+1)…长度-1)。每个{j->
float d=距离计算距离(第[i]段、第[j]段)
如果(d<0.25){
h[j]=d
}
}
}
}

看起来这个类可能是无状态的(但您应该通过查看源代码来确认这一点)。如果是这样,您应该能够用单个实例安全地替换所有这些实例

如果这是一个Grails应用程序,您可以在
Bootstrap.groovy

def singleton = new NumberAwareComparator()

NumberAwareComparator.metaClass.constructor << { ->
    singleton
}
def singleton=newnumberrawarecomparator()
NumberWareComparator.metaClass.constructor
独生子女
}
或者,您可以将上面的代码放在Grails插件的
doWithDynamicMethods
闭包中


如果这不是一个Grails应用程序,您可以

它看起来可能是无状态的(但您应该通过查看源代码来确认这一点)。如果是这样,您应该能够用单个实例安全地替换所有这些实例

如果这是一个Grails应用程序,您可以在
Bootstrap.groovy

def singleton = new NumberAwareComparator()

NumberAwareComparator.metaClass.constructor << { ->
    singleton
}
def singleton=newnumberrawarecomparator()
NumberWareComparator.metaClass.constructor
独生子女
}
或者,您可以将上面的代码放在Grails插件的
doWithDynamicMethods
闭包中


如果这不是Grails应用程序,您可以

它是否向您显示了生成这些应用程序的代码?你有你的代码的例子吗?它向你展示了生成这些代码的代码吗?你有你的代码的例子吗?