Java 枚举实现特性-内存问题?

Java 枚举实现特性-内存问题?,java,groovy,memory-leaks,traits,dry,Java,Groovy,Memory Leaks,Traits,Dry,我正在尝试修改我的代码,为此我第一次使用了traits来增强我的enum 我想做的是:对于给定的字符串数组,查找至少与一个关键字匹配的所有枚举(不区分大小写) 下面的代码似乎工作正常,但我认为当方法getSymbolFromIndustries被调用数千次时,它会导致内存泄漏 这是VisualVM在运行大约10分钟后的一个捕获,在每次快照之后,列Live Objects总是在增加,与第二行相比,项目数量是如此巨大。。。 我的堆大小也一直在增加。。。 特点: trait-BasedOnCate

我正在尝试修改我的代码,为此我第一次使用了
traits
来增强我的
enum

我想做的是:对于给定的字符串数组,查找至少与一个关键字匹配的所有枚举(不区分大小写)

下面的代码似乎工作正常,但我认为当方法
getSymbolFromIndustries
被调用数千次时,它会导致内存泄漏

这是VisualVM在运行大约10分钟后的一个捕获,在每次快照之后,列Live Objects总是在增加,与第二行相比,项目数量是如此巨大。。。

我的堆大小也一直在增加。。。

特点:

trait-BasedOnCategories{
字符串[]类别
静态getSymbolFromIndustries(候选集合){
values().findAll{
value->!value.categories.findAll{
分类->候选人{
候选->分类.相等信号案例(候选)
}
}
.unique()
.isEmpty()
}
}
}
实现
trait

枚举KTC实现BasedOnCategories、BasedOnValue{ KTC_01([ “行业”:[“人工智能”、“机器学习”、“智能系统”、“自然语言处理”、“预测分析”、“谷歌眼镜”、“图像识别”、“应用程序”], '关键词':['AI','Voice recognition'] ]), //…更多价值观 KTC_43([ ‘工业’:[‘燃料’、‘石油和天然气’、‘化石燃料’], “关键词”:[“石油”、“石油”、“石油化工”、“碳氢化合物”、“炼油”] ]), //…更多价值观 KTC_60([ ‘行业’:[‘应用程序发现’、‘应用程序’、‘消费者应用程序’、‘企业应用程序’、‘移动应用程序’、‘阅读应用程序’、‘网络应用程序’、‘应用程序营销’、‘应用程序性能管理’、‘应用程序’], '关键字':['App','Application'] ]) KTC(价值){ this.categories=value.industries this.keywords=value.keywords } 我的数据驱动测试

def“GetKTCsFromIndustries”(实际收集,预期枚举[]){
期望:
assert expected==KTC.getSymbolFromIndustries(实际)
哪里:
实际|预期
[“石油和天然气”]|[KTC.KTC_43]
[“石油和天然气”]|[KTC.KTC_43]
石油和天然气、化石燃料
[‘石油和天然气’,‘自然语言处理’]|[KTC.KTC_01,KTC.KTC_43]
[“应用程序”]|[KTC.KTC_01,KTC.KTC_60]
['xyo']|[]
}
我的问题是:

  • 如果有人有线索帮我修复那些漏洞
  • 有没有更优雅的方法来编写
    getSymbolFromIndustries
    方法

谢谢。

不确定性能问题,但我会像这样重新设计您的特质:

trait-BasedOnCategories{
设置类别
无效集合类别(集合类别){
categories=新哈希集(cats*.toLowerCase()).asImmutable()
}
@groovy.transform.memonized
静态getSymbolFromIndustries(候选集合){
def lowers=candidates*.toLowerCase()
values().findAll{value->!lowers.disjoint(value.categories)}
}
}
现在是上下文的其余部分

trait BasedOnValues {
    Set<String> keywords
}

enum KTC implements BasedOnCategories, BasedOnValues  {
    KTC_01([
            'industries': ['Artificial Intelligence','Machine Learning','Intelligent Systems','Natural Language Processing','Predictive Analytics','Google Glass','Image Recognition'],
            'keywords': ['AI','Voice recognition']
    ]),
    // ... more values
    KTC_43 ([
            'industries': ['Fuel','Oil and Gas','Fossil Fuels'],
            'keywords': ['Petroleum','Oil','Petrochemicals','Hydrocarbon','Refining']
    ]),
    // ... more values
    KTC_60([
            'industries': ['App Discovery','Apps','Consumer Applications','Enterprise Applications','Mobile Apps','Reading Apps','Web Apps','App Marketing','Application Performance Management'],
            'keywords': ['App','Application']
    ])

    KTC(value) {
        this.categories = value.industries
        this.keywords = value.keywords
    }
}

// some tests

[
    [ [ 'Oil and Gas' ], [KTC.KTC_43] ],
    [ [ 'oil and gas' ], [KTC.KTC_43] ],
    [ [ 'oil and gas', 'Fossil Fuels' ], [KTC.KTC_43] ],
    [ [ 'oil and gas', 'Natural Language Processing' ], [KTC.KTC_01, KTC.KTC_43] ],
    [ [ 'xyo' ], [] ],
].each{
    assert KTC.getSymbolFromIndustries( it[ 0 ] ) == it[ 1 ]
}
trait-based属性值{
设置关键字
}
枚举KTC实现BasedOnCategories、BasedOnValue{
KTC_01([
‘工业’:[‘人工智能’、‘机器学习’、‘智能系统’、‘自然语言处理’、‘预测分析’、‘谷歌眼镜’、‘图像识别’],
'关键词':['AI','Voice recognition']
]),
//…更多价值观
KTC_43([
‘工业’:[‘燃料’、‘石油和天然气’、‘化石燃料’],
“关键词”:[“石油”、“石油”、“石油化工”、“碳氢化合物”、“炼油”]
]),
//…更多价值观
KTC_60([
‘行业’:[‘应用程序发现’、‘应用程序’、‘消费者应用程序’、‘企业应用程序’、‘移动应用程序’、‘阅读应用程序’、‘网络应用程序’、‘应用程序营销’、‘应用程序性能管理’],
'关键字':['App','Application']
])
KTC(价值){
this.categories=value.industries
this.keywords=value.keywords
}
}
//一些测试
[
[“石油和天然气”],[KTC.KTC_43],
[“石油和天然气”],[KTC.KTC_43],
石油和天然气、化石燃料、[KTC.KTC_43],
[[‘石油和天然气’、‘自然语言处理’、[KTC.KTC_01、KTC.KTC_43],
[['xyo'],[]],
].每个{
断言KTC.getSymbolFromIndustries(it[0])==it[1]
}

然后测量性能

我喜欢你清理
特征的方式
!我从来没有想过在groovy中使用
@memomeized
,但我每次都在node/react中使用它^^^^^^谢谢你!我会尽快完成基准测试,并在结果出来后对你的解决方案进行评论/批准;)非常感谢你带上time查看我的代码:)添加了
不相交的
,使代码更简单。顺便说一句,我在使用从groovy学到的技巧;)这是真的,
es6
groovy
有很多相似之处!:D基准测试的第一个结果似乎更好,
活动对象
经常被清理,
分配的对象
仍然存在如果我忘记了任何“死引用”,我将再次检查如何使用该方法
trait BasedOnValues {
    Set<String> keywords
}

enum KTC implements BasedOnCategories, BasedOnValues  {
    KTC_01([
            'industries': ['Artificial Intelligence','Machine Learning','Intelligent Systems','Natural Language Processing','Predictive Analytics','Google Glass','Image Recognition'],
            'keywords': ['AI','Voice recognition']
    ]),
    // ... more values
    KTC_43 ([
            'industries': ['Fuel','Oil and Gas','Fossil Fuels'],
            'keywords': ['Petroleum','Oil','Petrochemicals','Hydrocarbon','Refining']
    ]),
    // ... more values
    KTC_60([
            'industries': ['App Discovery','Apps','Consumer Applications','Enterprise Applications','Mobile Apps','Reading Apps','Web Apps','App Marketing','Application Performance Management'],
            'keywords': ['App','Application']
    ])

    KTC(value) {
        this.categories = value.industries
        this.keywords = value.keywords
    }
}

// some tests

[
    [ [ 'Oil and Gas' ], [KTC.KTC_43] ],
    [ [ 'oil and gas' ], [KTC.KTC_43] ],
    [ [ 'oil and gas', 'Fossil Fuels' ], [KTC.KTC_43] ],
    [ [ 'oil and gas', 'Natural Language Processing' ], [KTC.KTC_01, KTC.KTC_43] ],
    [ [ 'xyo' ], [] ],
].each{
    assert KTC.getSymbolFromIndustries( it[ 0 ] ) == it[ 1 ]
}