Chinese, Simplified subtitles

← 04-02 Memory,_GC,_and_Performance

04-02 Memory,_GC,_and_Performance

Get Embed Code
13 Languages

Showing Revision 3 created 02/08/2016 by sp16.

  1. 不是所有指令都执行得又快又好,
  2. 下面介绍内存及它如何影响系统运行。
  3. 普遍认为,多数程序语言接近硬件或高性能。
  4. 如C语言 C++语言和Fortran。
  5. 通常程序工程师会自己管理内存。
  6. 高手工程师对内存的分配,
  7. 会慎重理处理,
  8. 并在未来结束使用时再次分配。
  9. 一旦确认何时及怎样分配内存,
  10. 内存管理的品质就仰赖于工程师的技能跟效率。
  11. 责任重大啊!
  12. 实际情况是工程师们,
  13. 不都会去追踪那零碎的内存碎片。
  14. 程序开发是件混乱又疯狂的过程,
  15. 内存通常都没办法完全被释放。
  16. 这些被囚禁的内存块叫内存漏洞。
  17. 内存漏洞占用了大量资源,这些资源其实可以更好地使用。
  18. 为减少漏洞引起的混乱、负担、甚至资金损失,
  19. 便有了内存管理语言。
  20. 这些语言在运行时跟踪内存分配,
  21. 以便当程序不再需要时释放系统内存。
  22. 完全不用工程师亲自操作。
  23. 这项内存回收艺术或科学,在内存管理环境下叫垃圾清理。
  24. 这个设计概念是在1959年,
  25. 当初为了解决lisp语言问题,由John McCarthy发明的。
  26. 垃圾清理的基本概念有:
  27. 第一,找到未来无法存取的数据。
  28. 例如所有不受指令操控的内存。
  29. 第二,回收被利用过资源。
  30. 原理简单。但是2百万行编码,
  31. 跟4gigs的分配,在实际操作时却非常困难。
  32. 如果现在,在程序中有20000个分配。
  33. 垃圾清理定会让人困惑。
  34. 哪一个是没用的?
  35. 或者,
  36. 何时启动垃圾清理释放内存?
  37. 这些问题其实很复杂。
  38. 好在50年来,我们找到了解决问题的方法。
  39. 就是Android Runtime中的垃圾清理。
  40. 比McCarthy最初的方法更高级,
  41. 速度快且是非侵入性的。
  42. 经由分配类型,
  43. 及系统如何有效地组织分配以利GC的运行,
  44. 并作为新的配置。
  45. 所有影响android runtime的内存堆都被分割到空间中,
  46. 根据这些特点,哪些数据适合放到什么空间,
  47. 取决于哪个Android版本。
  48. 最重要的一点是,
  49. 每个空间都有预设的大小,
  50. 在分配目标时要跟踪综合大小,
  51. 且空间不断地扩大,系统需要执行垃圾清理。
  52. 以确保内存分配的正常运行。
  53. 值得一提的是使用不同的Android runtime,
  54. GC的运行方式就会不同。
  55. 例如在Dalvik中很多GC是停止世界事件,
  56. 意思是很多指令的运行直到操作完成才会停止。
  57. 当这些GCs所用时间超过一般值,
  58. 或者一大堆一起执行会耗费庞大的幀象时间,
  59. 这是很麻烦的事情。
  60. 坦白讲,
  61. Android工程师花费大量时间降低干扰,
  62. 确保这些程序以最快的速度运行。
  63. 话虽如此,在指令中影响程序执行的问题仍然存在。
  64. 首先程序在任意帧内执行GCs所用的时间越多,
  65. 消除少于16毫秒的呈像障碍,
  66. 所必需的时间就会变少。
  67. 如果有许多GCs或一大串指令一个接一个地操作,
  68. 帧象时间很可能会超过16毫秒的呈像障碍。
  69. 这会导致隐形的碰撞或闪躲。
  70. 其次,指令流程可能造成GCs强制执行的次数增多。
  71. 或者,执行时间超过正常值。
  72. 例如,在一个长期运行的循环最内侧分配囤积对象,
  73. 很多数据就会污染内存堆。
  74. 马上就会有许多GCs启动。
  75. 由于这一额外的内存压力,
  76. 虽然内存环境管理良好,
  77. 就算比其他语言复杂,
  78. 内存漏洞仍会产生。
  79. 这些漏洞在GCs启动时,通过无法被释放的数据污染内存堆,
  80. 严重降低可用空间的总量,
  81. 并以常规方式强制GC的执行。
  82. 就是这样,
  83. 如果要减少任意帧内启动GC的次数,
  84. 需要着重优化程式的内存使用量。
  85. 从指令的角度看,或许很难追踪这些问题的起因,
  86. 但是,
  87. 多亏Android SDK拥有一组不错的工具,
  88. 任你选择。