Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.06.2016, 14:35
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

утечка памяти?
Есть простой когд для статики (нода 5.11)
И он потихоньку отжирает память, и я не пойму почему, через час доходит до 100 метров, это локальный сервер, он просто отдает файлы, что я делаю не так?

"use strict";
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    mime = require("mime");

var staticPath = path.resolve("scripts-dist");

function getFile(filename) {
    if(fs.existsSync(filename)) {
       return fs.readFileSync(filename, "binary");
    }

    return null;
}

http.createServer(function(request, response) {

    var uri = url.parse(request.url).pathname,
        filename = path.join(staticPath, uri);

    let file = getFile(filename);

    if(file) {
        response.writeHead(200, {"Content-Type": mime.lookup(filename)});
        response.write(file, "binary");
        response.end();
    }
    else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not Found\n");
        response.end();
    }

}).listen(3001);
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2016, 19:31
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

cyber,
Не получается ли такой ситуации, что я сделал запрос на сервер, файл начинает считываться, я закрываю соединение, не дождавшись окончания загрузки и весь наполовину считанный файл зависает в оперативной памяти сервера?

Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?
Ответить с цитированием
  #3 (permalink)  
Старый 30.06.2016, 08:43
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Нода использует ленивый сборщик мусора, который не освобождает память до последнего - https://blog.heroku.com/node-habits-...-avoid-garbage.

+ проблемы destus'а. На локалхосте-то еще ладно, но в продакшене они угробят твой сервер.
Мало того, твой код попросту небезопасен. Что, если клиент запросит, скажем, ссылку "http://server.com/../.git"?

В таких случаях надо использовать потоки, но и там есть свои ньюансы. У Ильи в скринкасте по ноде есть видео по этой теме, глянь:
https://www.youtube.com/watch?v=KlvJOz9GUjU
https://www.youtube.com/watch?v=_j0LoOXnOF4

Последний раз редактировалось Erolast, 30.06.2016 в 08:45.
Ответить с цитированием
  #4 (permalink)  
Старый 30.06.2016, 09:27
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Erolast
Мало того, твой код попросту небезопасен.
Это мини дев сервер, так что это не проблема)
Сообщение от Erolast
Нода использует ленивый сборщик мусора, который не освобождает память до последнего
Знаю, поэтому зазал global.gc(); и флаг --expose-gc. (обновленый код)

"use strict";
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    mime = require("mime");

var staticPath = path.resolve("scripts-dist");

function getFile(filename) {
    if(fs.existsSync(filename)) {
       return fs.readFileSync(filename, "binary");
    }

    return null;
}

http.createServer(function(request, response) {

    var uri = url.parse(request.url).pathname,
        filename = path.join(staticPath, uri);

    var file = getFile(filename);

    if(file) {
        response.writeHead(200, {"Content-Type": mime.lookup(filename)});
        response.write(file, "binary");
        response.end();
        file = null;
        global.gc();
    }
    else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("404 Not Found\n");
        response.end();
    }

}).listen(3001);


Сообщение от destus
Не получается ли такой ситуации, что я сделал запрос на сервер, файл начинает считываться, я закрываю соединение, не дождавшись окончания загрузки и весь наполовину считанный файл зависает в оперативной памяти сервера
Спасибо, не подумал об этом.
Сообщение от destus
Или происходит считывание большого файла в оперативную память и затем он начинает отдаваться клиенту. А если клиент медленный или таких клиентов много?
Это все для локального пользования.
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #5 (permalink)  
Старый 30.06.2016, 12:44
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Erolast
https://www.youtube.com/watch?v=KlvJOz9GUjU
https://www.youtube.com/watch?v=_j0LoOXnOF4
все стало понятно, спасибо
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти в плагине для jQuery. TheWanderer jQuery 0 20.11.2013 16:22
Утечка памяти и борьба новым способом) KupueIIIKo Элементы интерфейса 6 03.08.2012 11:55
утечка памяти. $.post otvernu jQuery 16 17.08.2010 12:40
утечка памяти при создании DOM MadLord Общие вопросы Javascript 2 16.08.2010 12:01
Как происходит утечка памяти в даном случае? Yazla Общие вопросы Javascript 2 09.11.2009 13:02