这是一个我们难以理解的问题.用文字描述它是很棘手的,但我希望能够理解这个要点.
我知道字符串的实际内容包含在内部char数组中.在正常情况下,字符串的保留堆大小将包括40个字节加上字符数组的大小.这在这里解释.调用子字符串时,字符数组保留对原始字符串的引用,因此字符数组的保留大小可能比字符串本身大很多.
但是,当使用Yourkit或MAT分析内存使用情况时,似乎会发生奇怪的事情.引用char数组保留大小的字符串不包括字符数组的保留大小.
一个例子如下(半伪代码):
String date = "2011-11-33"; (24 bytes)
date.value = char{1172}; (2360 bytes)
Run Code Online (Sandbox Code Playgroud)
字符串的保留大小定义为24个字节,不包括字符数组的保留大小.如果由于许多子字符串操作而导致对字符数组的引用很多,这可能是有意义的.
现在,当此字符串包含在某种类型的集合(如数组或列表)中时,此数组的保留大小将包括所有字符串的保留大小,包括字符数组的保留大小.
然后我们有这样的情况:
Array's retained size = 300 bytes
array[0] = String 40 bytes;
array[1] = String 40 bytes;
array[1].value = char[] (220 bytes)
Run Code Online (Sandbox Code Playgroud)
因此,您必须查看每个数组条目,以尝试确定保留大小的来源.
同样,这可以解释为数组包含所有保存对同一字符数组的引用的字符串,因此数组的保留大小总是正确的.
现在我们解决了这个问题.
我在一个单独的对象中保留了对上面讨论的数组的引用以及具有相同字符串的不同数组.在两个数组中,字符串引用相同的字符数组.这是预期的 - 毕竟我们正在讨论相同的字符串.但是,此字符数组的保留大小将计入此新对象中的两个数组.换句话说,保留的大小似乎是双倍的.如果我删除第一个数组,那么第二个数组仍将保持对字符数组的引用,反之亦然.这引起了混淆,因为似乎java对同一个字符数组持有两个单独的引用.怎么会这样?这是java内存的问题还是仅仅是分析器显示信息的方式?
这个问题让我们在尝试追踪应用程序中的大量内存使用时遇到了很多麻烦.
再次 - 我希望那里的人能够理解这个问题并解释它.
谢谢你的帮助
我有一个rails应用程序,它在控制器的内存中有一个png文件,由spark_pr生成.
@pngfile << Spark.plot( [47, 43, 24, 47, 16, 28, 38, 57, 50, 76, 42, 20, 98, 34, 53, 1, 55, 74, 63, 38, 31, 98, 89], :has_min => true, :has_max => true, 'has_last' => 'true', 'height' => '40', :step => 10, :normalize => 'logarithmic' )
@user=User.all.first
Run Code Online (Sandbox Code Playgroud)
我想在我的视图中渲染这个png文件,即app/views/users/show.html.erb,它具有由Rails脚手架生成器生成的标准内容,其中显示了@user的各种属性.
如何在视图中呈现此内存文件(@pngfile)?我不想保存文件,也不想为该文件提供临时URL.我已经在HTML页面上看到了这一点,其中内嵌图标是从二进制blob渲染的,所以我知道这是可能的.但我无法弄清楚使用Rails视图助手的神奇咒语使这成为可能.
-----------编辑:更多信息-------------------------
此站点提供了有关如何嵌入URL的更多信息.文件夹图标的代码如下所示:
<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7"
width="16" height="14" alt="embedded folder icon">
Run Code Online (Sandbox Code Playgroud)
我在我的视图中嵌入了这个确切的代码,它适用于Chrome,Firefox和IE9.
所以我尝试用我的火花情节做这个.
在我的Rails控制器中,我这样做了:
@pngfile = Base64.encode64 Spark.plot( [47, 43, 24, 47, 16, 28, 38, 57, 50, 76, …Run Code Online (Sandbox Code Playgroud) takeUnretainedValue和之间有什么区别takeRetainedValue?根据Apple的文档:
这两种方法都返回原始的,未包装的对象类型.您可以根据要调用的API是否返回未保留或保留的对象来选择要使用的方法.
但是,我如何知道非托管对象是未保留对象还是保留对象?例如,该方法ABAddressBookCreateWithOptions:从AddressBook框架返回一个非托管对象ABAddressBook,其中一些教程认为这是一个保留的对象.使用时ALAsset,该方法thumbnail返回一个非托管对象CGImage,一些教程认为这是一个未保留的对象.
我将感激你的帮助.
memory-management retained-in-memory unsafe-unretained swift