TypeScript 中的内存释放
Posted
技术标签:
【中文标题】TypeScript 中的内存释放【英文标题】:Memory deallocation in TypeScript 【发布时间】:2015-02-21 05:33:48 【问题描述】:我有一个变量oneDay
,我为其分配了一个整数
var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
我在声明代码的函数终止结束时使用以下语法释放oneDay
占用的内存。
var oneDay=null;
我得到的错误:
错误 TS2134:后续变量声明必须具有相同的 类型。变量“oneDay”必须是“Date”类型,但这里有类型 '空'。
可能的解决方案是什么??谢谢
【问题讨论】:
你为什么认为这是释放内存?让它超出范围。 你不会在 javascript 中手动管理内存 你为什么要重新声明一天 @Jain 说了什么;这是你的错误的真正原因。 我不确定,但它适用于你 $scope.days = null 或删除 $scope.days 【参考方案1】:原因:您正在重新声明此变量,这就是您收到此错误的原因。 试试这个:
oneDay = null;
$scope.days = null
或
delete $scope.days
【讨论】:
delete oneDay
绝对不会做任何事情。
不幸的是,这个接受的答案是不恰当的。将变量设置为 null 绝对没有用(因为存储 null
占用的空间与存储一天中的毫秒数相同),即使您需要担心内存管理,当然您不需要.
我的回答是可以更新null后可以释放变量的内存空间。请阅读:***.com/questions/2999604/…
在这种情况下,他正在“释放”一个复杂对象(一个数组)。您正在尝试通过将其设置为不同的标量(null)来“释放”标量(单个值,原始)。将标量设置为 null 不会释放任何内容,它只是将其值更改为 null。可能有一些极其特殊的情况,您需要通过将复杂对象设置为 null 来帮助 JS 解决其 GC,但这个问题的真正答案,在我之后非常仔细地重复,是 您不需要做任何分配,或释放,或 JavaScript 中的任何其他形式的内存管理。
另外,请阅读@SteveFenton 的答案,他应该知道他在用 60K 的代表在说什么。他的答案应该被标记为接受。【参考方案2】:
在 JavaScript 中为您管理内存。
所有现代浏览器都使用标记和扫描算法来检测无法访问的对象(一些较旧的浏览器使用引用计数算法,该算法无法收集存在引用循环的对象,因为总会有引用)*。
一旦一个对象不再被引用,它就有资格进行垃圾回收(尽管垃圾回收将在“某个时间点”发生,而不是立即发生)。
总体而言,您无需担心 JavaScript 或 TypeScript 中的内存管理 - 除非您有可衡量的问题。
(* 来自 Pro TypeScript,p168-170)
【讨论】:
感谢@Steve 分享这些宝贵的信息以上是关于TypeScript 中的内存释放的主要内容,如果未能解决你的问题,请参考以下文章