gpt4 book ai didi

使用 setInterval 的 JavaScript 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 12:50:15 26 4
gpt4 key购买 nike

我的 javascript 应用程序内存泄漏有问题。我在网上查过东西,我似乎已经通过使用

关闭了 setInterval 循环中的所有内存分配
variableX = null

技术。但是应用程序仍然以某种方式泄漏内存,任何人都可以指出可能导致这种泄漏的原因吗?这是我的代码:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Simple markers</title>
<style>
html, body, #map-canvas {
height: 100%;
margin: 0px;
padding: 0px
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script>

function initialize() {
var myLatlng = new google.maps.LatLng(43.46949, -80.54661);
var lat = 0;
var long = 0;
var mapOptions = {
zoom: 16,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}

function loadXMLDoc() {
var xhr;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xhr = new XMLHttpRequest();
} else { // code for IE6, IE5
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("GET", "coordinates.txt", true);
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
var textfileString = this.responseText;
var longLatString = textfileString.split(',');
lat = parseFloat(longLatString[0])
long = parseFloat(longLatString[1])
textfileString = null
longLatString = null
}
}
xhr.send();
xhr = null
}
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Hello World!'
});
setInterval(function () {
loadXMLDoc()
var newLatLng = new google.maps.LatLng(lat, long);
marker.setPosition(newLatLng);
newLatLng = null
}, 16);
}
google.maps.event.addDomListener(window, 'load', initialize);

</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>

最佳答案

您正在发送一个新的 XMLHttpRequest 而无需等待旧的完成。如果接收到响应的时间超过 16 毫秒(很可能会这样),“请求队列”将会增长,从而导致内存泄漏。

不间断发送请求不是个好主意。如果您需要持续不断的坐标流,请将多个坐标打包到一个响应中,并仅在前一个请求完成后才发送新请求:

function getCoordinates() {
...
xhr.onreadystatechange = function() {
...
setTimeout(getCoordinates, 30000);
}
}

更好的是,使用 Websockets。

关于使用 setInterval 的 JavaScript 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21210859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com