如何通过在Java中压缩对象来减少总内存占用?

如何通过在Java中压缩对象来减少总内存占用?,java,performance,design-patterns,caching,map,Java,Performance,Design Patterns,Caching,Map,我有一个大约有20列的表,大部分由varchar和小数组成。这张桌子有将近150万行。但它们很少有共同之处,比如column1只包含100个不同的字符串,column2几乎有1000个,column3几乎有500个 现在,我将所有这些列值存储在一个映射中,键作为前5列,数据作为其余列。我的任务就是这样,我需要在任务开始时初始化所有这些 我应该使用什么模式(如Flyweight等)或数据结构来最小化对象存储 为什么我需要预加载所有数据? 假设表中的所有数据都是一棵树,受害者可以是任何叶子、树干或根

我有一个大约有20列的表,大部分由varchar和小数组成。这张桌子有将近150万行。但它们很少有共同之处,比如column1只包含100个不同的字符串,column2几乎有1000个,column3几乎有500个

现在,我将所有这些列值存储在一个映射中,键作为前5列,数据作为其余列。我的任务就是这样,我需要在任务开始时初始化所有这些

我应该使用什么模式(如Flyweight等)或数据结构来最小化对象存储

为什么我需要预加载所有数据?


假设表中的所有数据都是一棵树,受害者可以是任何叶子、树干或根。因此,对于每个条目[来自不同的地方],我需要查看树中是否有匹配项。

内部化不是最佳选择。从PermSpace收集垃圾是可能的,但是VM没有针对任何内容进行优化

您可以实现自己的CharSequence实现,该实现由共享char[]数组支持

通过CharSequence实现,您将能够实现基本的共享语义,如内部化的字符串或考虑子字符串和其他投影的更复杂的字符串


自定义CharSequence实现也可以进行优化,以执行的内存分配比正在复制char[]的String类更少(出于安全原因,如果完全控制支持char[],则不需要)。即使是
newstring(“…”).intern()
也会提示一个新的字符串实例(char[]数组),该实例会被快速垃圾收集。

我的第一个问题是,您计划如何处理表中的数据?将完整的表预加载到内存中并不总是最好的方法,例如,保持当前设置,但按需加载可能是更好的解决方案。您可能需要调查一段时间内未使用的刷新数据,即最近使用的一种地图

你能详细说明一下你的任务试图通过缓存在地图中的所有数据来实现什么吗

“受害者”身份是钥匙的一部分还是物体的一部分?如果是对象的一部分,如何选择选择所需对象的关键点?换言之;听起来您试图重现数据库非常擅长的功能


如果您的问题是表内容不容易映射到树状结构上,您可以通过DB接口使用的方式添加该信息。

如果您的数据加载过程能够支持它,那么在没有GC permgen副作用的情况下实现String.intern()之类的内容就不太困难了

对于任何可散列数据元素,只需使用
映射
即可查找先前存在的实例。所以对于字符串:

Map<String,String> stringCache = new HashMap<String,String>();
...
String sharedValue = stringCache.get(loadedValue);
Map stringCache=newhashmap();
...
String sharedValue=stringCache.get(loadedValue);

从何处加载数据的过程仍将创建临时字符串,但这些字符串将被快速GC’ed。如果不知道数据来自何处的更多细节,就很难评论这些临时对象是否必要。。。尽管我很难找到解决办法。无论如何,它们在加载过程中都会很快被回收。

您的意思是,在我的情况下,这将有什么帮助?如果您可以在您的上下文中自由地用CharSequence替换字符串,您可以有一个比通用字符串实现更好的自定义实现。我认为这可能会有所帮助,但无法实现这一点。你能提供一些实现或者一些好的链接来了解细节吗?这个看起来很简单。谢谢,我会调查这个RSP,我在问题中加了这个。