Как использовать сборку "мусора" для удаления файлов?

Если вы хотите сохранить информацию о номере строки (каждое сообщение указывает на свой вызов .log (), а не все указывает на нашу оболочку), вы должны использовать .bind(). Вы можете добавить дополнительный аргумент временной метки с помощью console.log.bind(console, ), но проблема в том, что вам нужно повторять это каждый раз, чтобы получить функцию, связанную с новой временной меткой. Неловким способом сделать это является функция, которая возвращает связанную функцию:

function logf() {
  // console.log is native function, has no .bind in some browsers.
  // TODO: fallback to wrapping if .bind doesn't exist...
  return Function.prototype.bind.call(console.log, console, yourTimeFormat());
}

, которая затем должна использоваться с двойным вызовом:

logf()(object, "message...")

НО мы можем сделать первое Вызвать неявно, установив свойство с функцией getter:

var origLog = console.log;
// TODO: fallbacks if no `defineProperty`...
Object.defineProperty(console, "log", {
  get: function () { 
    return Function.prototype.bind.call(origLog, console, yourTimeFormat()); 
  }
});

Теперь вы просто вызываете console.log(...) и автоматически добавляется метка времени!

> console.log(12)
71.919s 12 VM232:2
undefined
> console.log(12)
72.866s 12 VM233:2
undefined

Вы можете даже достичь этого магического поведения с помощью простого log() вместо console.log(), выполнив Object.defineProperty(window, "log", ...).


См. https://github.com/pimterry/loglevel для хорошо выполненной безопасной оболочки консоли, использующей .bind(), с ошибками совместимости.

См. https://github.com/eligrey/Xccessors , чтобы узнать о возможностях восстановления совместимости с defineProperty() на устаревший __defineGetter__ API. Если ни одно из свойств API не работает, вам следует вернуться к функции-оболочке, которая каждый раз получает новую метку времени. (В этом случае вы потеряете информацию о номере строки, но отметки времени все равно будут отображаться.)


Boilerplate: форматирование времени так, как мне нравится:

var timestampMs = ((window.performance && window.performance.now) ?
                 function() { return window.performance.now(); } :
                 function() { return new Date().getTime(); });
function formatDuration(ms) { return (ms / 1000).toFixed(3) + "s"; }
var t0 = timestampMs();
function yourTimeFormat() { return formatDuration(timestampMs() - t0); }

6
задан Newtopian 1 July 2009 в 01:28
поделиться

7 ответов

Конечно, можете. Вопрос в том, действительно ли вы хотите:)

Я действительно сталкивался с этой проблемой в дикой природе; как вы заметили, очистка временных файлов с помощью deleteOnExit () бесполезна при запуске службы, а не приложения. Я обнаружил, что наиболее стабильным решением было реструктурировать поток программы таким образом, чтобы временные файлы создавались для каждой задачи и явно удалялись, когда они больше не нужны.

Если вы сделаете это любым другим способом, то есть если программа будет не имея возможности решить, следует ли сохранить или удалить временный файл на каком-либо этапе выполнения, у вас может быть проблема с дизайном. Перенос файлов в какой-нибудь менеджерский жгут просто отложит "настоящее" решение;)

3
ответ дан 10 December 2019 в 02:52
поделиться

Сборка мусора - неправильное пространство имен для этого типа обработки информации.

Для обработки временных файлов должно быть достаточно следующего пункта.

  1. Вам следует попытаться удалить файл сразу после того, как вы больше не используете его. Блок finalize может справиться с этим.

  2. Вы должны использовать DeleteOnExit.

  3. Вы можете создавать свои временные файлы в специальном временном каталоге. Этот временный каталог можно удалить при запуске и закрытии приложения, чтобы убедиться, что временные файлы не существуют после закрытия приложения.

1
ответ дан 10 December 2019 в 02:52
поделиться

Вы можете посмотреть PhantomReference :

Phantom ссылочные объекты, которые ставятся в очередь после того, как сборщик определяет, что в противном случае их референты могут быть возвращены. Фантомные ссылки чаще всего используются для планирования предварительных действий по очистке более гибким способом, чем это возможно с помощью механизма финализации Java.

2
ответ дан 10 December 2019 в 02:52
поделиться

Relying on an event to fire when your class is destroyed is not going to be foolproof, and may leave files behind.

I think the simplest and most reliable way to achieve cleanup of your temp files is as follows:

  • Write an event handler for when your program closes to clean up any files you had open during your current session.
  • Write a procedure that will run when your program starts, which deletes any temp files in this folder which are older than 24 hours.

With this approach you need not fear if your program crashes for some reason and leaves temp files behind, and you also don't need to worry about the program deleting files which are still in use.

2
ответ дан 10 December 2019 в 02:52
поделиться

Сборщик мусора бесполезен для таких вещей. Он разработан для управления памятью и может иметь много недостатков.

  • Ваш объект может быть собран долгое время после того, как файл больше не используется.
  • Ваш объект не гарантирован.

] И то, и другое случается особенно часто, если Java запускается с большой кучей - что на стороне сервера не является необычным.

В какой-то момент в вашей программе вам нужно закрыть потоки в этом файле (в противном случае вы съедает дескрипторы системных файлов, что делает систему непригодной для использования, я это уже сделал). В момент закрытия потоков вы также можете удалить связанный файл. Это самый чистый способ.

1
ответ дан 10 December 2019 в 02:52
поделиться

Ну, вы могли бы создать оболочку для файла, который использует финализатор для удаления вашего файла, когда объект собирается сборщиком мусора.

Но финализаторы не вызываются любым предсказуемым способом, поэтому я бы вообще не рекомендовал это.

0
ответ дан 10 December 2019 в 02:52
поделиться

Сборщик мусора - не то место, где можно освобождать ресурсы такого типа. Пожалуйста, ознакомьтесь с этими двумя статьями ниже о том, как освободить ресурсы на Java. http://c2.com/cgi/wiki?ReleasingResourcesInJava А также проблемы с производительностью финализаторов Java. Они могут дать некоторое представление и понимание того, как его следует использовать. http://www.enyo.de/fw/notes/java-gc-finalizers.html

0
ответ дан 10 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: