我过去已经对JavaScript内存管理做了一些阅读,并且意识到循环DOM引用的问题等.
但是我仍然有点不舒服,因为这转换为服务器端JavaScript环境,例如node.js,更具体地说是写在express上的API .
var npm_moduleA = require('npmA')({ someInitArg : 'blah' }),
app = express.createServer();
app.get('/api/foo', function (req, res) {
var result = npm_moduleA.doSomething();
res.send(result);
});
app.get('/api/bar', function (req, res) {
var npm_moduleB = require('npmB')({ someInitArg : 'blah' }),
result = npm_moduleB.doSomethingElse();
res.send(result);
});
Run Code Online (Sandbox Code Playgroud)
什么是生命周期npm_moduleA?它能够在瞬间创建的服务器启动,但是当(如果有的话确实GC踢反对) -我猜测,它从来没有被感动,因为它在全球范围内?
在'/ api/bar /'中,npm_moduleB每次请求后都应该删除吗?或者这应该留给GC单独使用.
全局实例化是否npm_moduleA比重复实例化(以及可能的删除)明显更有效npm_moduleB?
我正在努力更好地了解ionic2和ionic3.
垃圾收集如何在离子中起作用?
就像在这张图片中看到的那样(来源):
当进入新页面时,一些内存获得G.C'd.然而,记忆仍然显着高于任何视频播放前的记忆.
在性能范围上,删除不再需要的元素是否有意义?或者浏览器是否在dom元素上执行自动垃圾收集,这些在代码中没有进一步引用?
$('some_element').fadeOut(1000, function(el){
$(el).remove(); // <-- does this make sense at all?
});
Run Code Online (Sandbox Code Playgroud) 我实现了无限滚动:
new_page_value = 1;
$(window).scroll(function() {
if($(window).scrollTop() >= $(document).height() - $(window).height() - 200) {
new_page_value = parseInt(new_page_value) + 1;
get_page(new_page_value);
}
});
Run Code Online (Sandbox Code Playgroud)
当用户几乎到达页面底部(200px左侧)时,get_page()将调用该函数.这包含一个ajax调用,它获取新页面的所有内容并将其附加到<body>文档的内容中.
现在我才意识到,如果我的网站变大,而不是有10个小页面,我有一个巨大的巨型页面,那么用户的浏览器可能会崩溃,如果它们足够持久以保持无限滚动很长时间.
这可能是解决此问题的可能方法:
我将继续将新页面添加到文档中,<body>直到第10页,之后我将<body>完全替换内容而不是附加内容.所以使用html()而不是append().
我只是不知道这是否真的可以防止崩溃.将.html()清除之前通过ajax引入的html的"记忆"吗?
我对此感到困惑,因为我看过几个不同的评论.我正在阅读一本javascript书,其中提到将全局变量设置为null是一种很好的做法(假设没有其他引用)并且GC在下一次扫描时回收此变量的内存.我已经看到其他评论说全局变量从未被GC处理过.
此外,当在OOP结构中编写javascript时,如果我有类似这样的东西(游戏在全局上下文中)会发生什么:
var game = {};
game.level = 0;
game.hero = new hero();
//do stuff
game.hero = null;
Run Code Online (Sandbox Code Playgroud)
由于英雄生活在一个存储在游戏中的对象中,这个对象位于全局上下文中,如果我将例如英雄设置为null,那么这会被GC处理吗?
我想基本上删除我创建的对象.我们如何删除对象?
我在这里检查了Object定义,但无法弄清楚这样做的方法.我也很好奇我们是否可以定义析构函数.
更新
问题是获得好的答案.但我想提请你注意我想要删除我的对象或调用析构函数的情况.假设我们想要使用您可以通过放置在其上的端口连接矩形来创建节奏.因此,我们的想法是拥有一个对象,该对象具有对矩形体的引用和两端的端口.实际上,该对象可能需要一些其他属性,如[bool] selected或[bool] dragging或[List<RectElement>] connectedSquares.例如,当用户选择矩形并命中退格时,我想确保矩形消失并且我的对象被正确删除.因此,这个用例可以更深入地了解这个问题.
我目前正在阅读"Javascript Good Parts",我发现了以下段落
如果我们尝试从对象检索属性值,并且对象缺少属性名称,则JavaScript会尝试从原型对象中检索属性值.如果该对象缺少属性,那么它将转到其原型,依此类推,直到该进程最终以Object.prototype结束.
如果我从obj1创建一个对象obj2作为原型,这是否意味着obj1不能被销毁,直到obj2也超出范围?
我一直在浏览很多关于JavaScript严格模式的博客文章,文档等.
我注意到delete关键字有很多限制.我甚至不知道你是否可以称他们为限制.似乎delete不再有效.
我很想用严格的模式.这是一个好主意.但我也认为删除是一个好主意.
有没有其他方法可以"删除"变量,或者我只是搞砸了?
我的问题是假设您正在创建一个将长时间显示的网页.我很好奇在这种情况下使用JQuery/JavaScript会导致内存泄漏的常见问题是什么?例如,当您调用$.remove()元素集合时,内存会发生什么?谢谢!
以此代码为例:
var test = (function(){
var name = 'rar';
return function foo(){
console.log('test');
};
}());
Run Code Online (Sandbox Code Playgroud)
foo获取返回到test 没有任何引用到name在内部范围.怎么了name?它被摧毁了吗?或者它是否继续存在并与返回的函数混淆,但是无法访问?第一种情况是否类似于执行以下操作,好像name从来不是等式的一部分?:
var test = function foo(){
console.log('test');
};
Run Code Online (Sandbox Code Playgroud)
这是另一个案例:
var test2 = (function(){
var name = 'rar';
var age = '20';
return function foo(){
console.log(age);
};
}());
Run Code Online (Sandbox Code Playgroud)
age被引用foo并将形成一个闭包.但是,name仍然没有被任何东西引用.name在这种情况下会发生什么?它被摧毁了吗?或者它是否继续存在并与返回的函数混淆,但是无法访问?