`
tk_zhang
  • 浏览: 232069 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内存数据优化策略

    博客分类:
  • Java
阅读更多

      我们能做点什么呢?  
  “这很好,但是我们没有任何选择除了使用String和其它Java提供的类型,是不是这样呢?”我听到你们再问,那么让我们来找找答案吧。

  封装类
  
  封装类比如java.lang.Integer,看起来保存大量的数据在内存 中像一个坏的选择。假如你尽力为了内存的经济,那么就要避免这么做。使用你自己的针对int的向量类并不难。当然,假如Java的核心函数库已经包含了这 个那就最好不过了。或许这种情况在Java拥有非凡类型的时候将会大大改观。
  
  多位数组
  
   对于使用多维数组的大型的数据结构,你可以时常的通过简单的索引变换减少额外的维数/例如:转换int[dim1][dim2]的实例到一个 int[dim1*dim2]的实例,改变所有形如a[i][j]的表达式为a[i*dim1+j]。这样你就不必花功夫在dim1上的索引检查可以提高 效率。
  
    java.lang.String
  
  你可以使用一些小技巧去减少你的应用中字符串的静态内存大小。
  
   首先,你可以尝试一种很平常的技术,就是当一个应用从一个数据文件或者网络连接中载入或者缓存很多的字符串,并且这种字符串的值是有限变化的。举个例 子:假如你想分析一个XML文件,在这个文件中,你经常碰到某种属性,但是这个属性仅仅被限制在两个可能的值。你的目标:通过一个散列映射过滤所有的字符 串,减少所有相同的但是明显字符串和目标对象引用一样的。

public String internString (String s) {
  if (s == null) return null;
       String is = (String) m_strings.get (s);
  if (is != null)
       return is;
  else {
       m_strings.put (s, s);
       return s;
  }
}
  
private Map m_strings = new HashMap ();

 假如适用成功,这个技巧能够成倍的减少你的静态内存需求。一个富有经验的读者应该能够观察到这个技巧复制 java.lang.String.intern()的功能性。有无数的理由存在来让你避免使用String.intern()方法。其中一个就是现在的 JVM几乎没有能实现大量数据的保留。
  
  假如你的字符串是完全不同的,会发生什么情况呢?这就是要介绍的第二个技巧,重新收集那些 小的字符串空间,这些空间潜在的隐藏于char数组中,因为使用数组大概只占了字符串封装所占用的内存的一半。因此,当我们的应用缓存许多独特的字符传 值,我们仅仅只要保持在内存中的数组,在需要的时候转换为字符串。假如这个字符串只是作为暂时的,很快就会抛弃,这将很有效果。一个简单的实验就是从一个 字典文件中选出作为缓存的90000个单词,这些数据大约5.6M的大小,假如是char的话,只需要3.4M的空间,只占用了以前的65%。
  
   第二个技巧明显的包含一个不利条件,就是你不能支持通过一个构造函数转换一个char[]成为字符串,因为这个构造函数没有复制这个数组而将拥有这个数 组。为什么呢?因为这个完全的public的字符串API确保每一个字符串是不可变的,所以每个字符串的构造函数显然要复制输入的数据然后传入它的参数。
  
   然后,我们将使用第三个技巧。这个技巧用在当转换一个char数组为一个字符串的代价证实太高的时候。该技巧使用 java.lang.String.substr()的功能避免数据复制:这个方法的是显示用了字符串的不变性,并且创建的一个影子字符串对象来共享字符 内容,但是它的内部的开始位置和结束位置都是正确的。我们还是写一个例子,new String(“smiles”).substring(1,5)是一个字符串,这个字符串是字符缓冲从位置1到位置4的字符结束,并且这个字符缓冲将共 享原来的字符串构造函数指向的字符缓冲。你可以象一下这样使用:给出一个大的字符串集合,你可以合并它的字符内容到一个大的字符数组,在它之上创建一个字 符串,并且使用这个主串的子串来重新创建一个原来的字符串。如以下描述:

public static String [] compactStrings (String [] strings) {
  String [] result = new String [strings.length];
  int offset = 0;
  for (int i = 0; i < strings.length; ++ i)
  offset += strings [i].length ();
  // Can't use StringBuffer due to how it manages capacity
  char [] allchars = new char [offset];
  offset = 0;
  for (int i = 0; i < strings.length; ++ i) {
       strings [i].getChars (0, strings [i].length (), allchars, offset);
       offset += strings [i].length ();
  }
  String allstrings = new String (allchars);
  offset = 0;
  for (int i = 0; i < strings.length; ++ i)
  result [i] = allstrings.substring (offset,
     offset += strings [i].length ());
  return result;
}

     以上方法返回一个新的字符串集等同于输入的字符串集,但是在内存中更加得紧凑。重新获得每个字符串数组的16个字节的头部,在方法中被有效的移除。这个存 储在缓存压缩大多数短的字符串时比较有效果。当这个方法用于同样的90000个单词的字典时,内存从5.6M节约到4.2M,大概节约了30%。
  
     这些努力是否值得呢?
   我这里提到的方法看起来都是很细微的优化,是否值得花时间去实现呢?但是,记住我们脑子里面应该记住:服务端的应用程序能够缓存大量的数据在内存中的话 讲能够大大的提高从磁盘和数据库提取数据的性能和效率。在当前32位的JVM中,几百兆的缓存数据代表堆中很引人注重的位置。减少30%或者更多不应该被 嘲笑,它能将系统的可测性质中能提高很显著的水平。当然这些技巧不适用于一开始就很好设计的数据结构,事实的决定要由hotspots来决定。无论如何, 你现在应该更加了解你的对象消耗了多少内存。
  
  关于作者:
  Vladimir RouBTsov拥有超过12年的多种语言的编程经验,其中包括从1995年就开始用得Java。目前,它作为资深开发者在Austin, Texas.为Trilogy开发企业级软件。平时的业余爱好就是开发一些关于Java字节代码或源程序代码的工具。

分享到:
评论

相关推荐

    云计算系统下多虚拟机内存的协同优化方式.pdf

    内存优化策略主要包括页面复用技术、内存动态调整机制和多虚拟机内存平衡技术。页面复用技术能够让虚拟机内存的某些页面与主机操作系统的交换分区进行交换,从而使得内存空间得到有效扩展。内存动态调整机制,如气球...

    易语言之内存优化模块

    这个模块通过优化内存分配和回收策略,帮助开发者编写出更节省资源、运行更快的易语言程序。在易语言中,内存优化是提升软件稳定性和执行速度的关键因素之一。 内存优化主要包括以下几个方面: 1. **内存分配优化*...

    内存优化工具.内存优化让你电脑持久有力!

    4. **系统调优**:一些高级的内存优化工具还能调整系统设置,例如内存分配策略,以适应不同的工作场景。 首次使用内存优化工具时,建议进行深度优化,这通常涉及更全面的内存分析和清理,包括检查和处理长期占用...

    内存优化内存优化专家

    5. **内存压缩**:某些内存优化工具使用内存压缩技术,将内存中的数据压缩,以减少实际占用的空间,从而提高物理内存的利用率。 6. **智能内存分配**:优化专家可能具备智能算法,根据程序运行的模式和需求,动态...

    提升性能的艺术:数据结构优化策略

    通过本文的介绍,我们学习了多种优化策略和技巧,希望能够帮助读者在实际开发中提高程序的性能。 本文详细介绍了数据结构性能优化的策略和技巧,包括选择正确的数据结构、时间复杂度和空间复杂度的优化、编码技巧、...

    windows内存优化软件

    4. 内存压缩:某些内存优化软件可能会使用内存压缩技术,通过压缩内存中的数据来节省内存空间,提高内存利用率。 5. 进程管理:能够列出系统中所有运行的进程,用户可以选择结束某些不重要的进程,以释放更多的内存...

    内存优化传家 内存优化传家

    内存优化是计算机系统性能提升的重要环节,特别是在处理大数据量、多线程或高并发应用时,内存管理的有效性直接影响到程序的运行效率和系统的稳定性。本文将深入探讨内存优化的相关知识点,帮助你更好地理解并实践...

    优化SQL Server服务器内存配置的策略

    ### 优化SQL Server服务器内存配置的策略 在企业级应用中,SQL Server作为核心数据库管理系统,其性能直接影响到业务流程的效率与响应速度。而内存作为数据库系统运行的关键资源之一,其合理配置对于提升SQL Server...

    易语言物理内存优化

    在编写易语言程序时,优化物理内存不仅仅是调用几个API那么简单,还需要考虑程序的数据结构、算法和内存分配策略。例如,合理地使用内存池、避免内存碎片、及时释放不再使用的内存等都是优化的重要手段。同时,理解...

    易语言模块优化内存模块.rar

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语句,降低了编程的门槛,使得更多非计算机专业的人...在使用这个模块时,需要注意与自己的程序逻辑相结合,合理配置和使用内存优化策略,以达到最佳效果。

    内存优化大师增加内存

    1. **合理设置优化策略**:过度的内存优化可能会影响正常程序的运行,因此应根据电脑配置和使用习惯选择合适的优化策略。 2. **定期更新软件**:确保内存优化大师为最新版本,以获取最新的优化技术和修复已知问题。 ...

    实时数据分析优化策略.pptx

    ### 实时数据分析优化策略 #### 数据采样技术的优化 数据采样技术是实时数据分析中的一个关键环节,它能够帮助我们在海量数据中快速提取有价值的信息,同时降低计算资源的消耗。以下是一些重要的数据采样优化策略...

    易语言模块内存优化.rar

    下面将详细讨论易语言中的内存管理和优化策略。 1. **内存分配与释放** 在易语言中,内存管理主要是通过系统提供的内存函数进行的,例如“分配内存”和“释放内存”。理解这些函数的工作原理是进行内存优化的基础...

    内存数据库数据的组织结构优化

    优化内存数据库的数据组织结构,关键在于减少数据冗余、提高数据局部性、优化数据存储布局,以及使用高效的索引机制等。有效的内存数据库设计需要结合具体的应用场景和需求,优化数据结构的使用和内存的布局。 例如...

    cpu内存优化器

    5. **自定义设置**:允许用户根据需求定制优化策略,比如为特定程序分配更多资源。 6. **安全保护**:确保优化过程中不会对系统稳定性造成负面影响,避免重要进程被误关闭。 7. **自动更新**:持续更新优化算法,...

    内存优化工具

    因此,用户应根据系统实际运行状况调整优化策略,避免过度依赖工具。 - **定期清理**:除了使用内存优化工具,用户还应定期清理无用的临时文件和注册表项,保持系统的清洁。 - **硬件升级**:如果系统频繁出现内存...

    内存智能优化工具

    4. **智能调度**:高级的内存优化工具具备智能调度功能,能够根据当前系统负载和用户习惯,动态调整内存分配策略。例如,在用户进行大型游戏或运行高性能软件时,工具会更倾向于保留更多的内存给这些高优先级的任务...

    代码优化:有效使用内存 --代码优化过程中内存的有效使用

    以下是一些关键的内存优化策略: 1. **最小化内存分配**:频繁的内存分配和释放会增加系统的负担,可能导致内存碎片。尽量减少动态内存分配,优先使用栈内存或对象池来存储数据。 2. **复用内存**:通过对象池或...

    推荐CUDA程序优化的15个策略

    CUDA 程序优化是一个复杂的过程,需要了解 CUDA 架构和内存模型,今天我们将讨论 15 个 CUDA 程序优化策略,相信对大家有一定的帮助。 策略 1: Memory Coalescing memory coalescing 是 CUDA 程序优化中非常重要...

Global site tag (gtag.js) - Google Analytics