Memory Groovy应用程序有数千个NumberAreComparator实例?
我正在运行一个IO密集型应用程序,当我运行jvisualvm profiler时,我看到NumberWareComparator占用了33%的内存和55%的所有对象 这正常吗?为什么会这样?我可以从哪里着手解决这个问题 /*更高版本-代码示例*/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
//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应用程序,您可以它是否向您显示了生成这些应用程序的代码?你有你的代码的例子吗?它向你展示了生成这些代码的代码吗?你有你的代码的例子吗?