Python: освобождение выделенной памяти [дубликат]

Добавление моих двух центов здесь - всегда по возможности используйте implements Runnable. Ниже приведены два оговорки о том, почему вы не должны использовать extends Thread s

  1. В идеале вы никогда не должны расширять класс Thread; класс Thread должен быть сделан final. По крайней мере, такие методы, как thread.getId(). См. это обсуждение для ошибки, связанной с расширением Thread s.
  2. Те, кто любит решать головоломки, могут видеть другой побочный эффект расширения Thread. Приведенный ниже код будет печатать недостижимый код, когда никто не уведомляет их.

См. http://pastebin.com/BjKNNs2G .

public class WaitPuzzle {

    public static void main(String[] args) throws InterruptedException {
        DoNothing doNothing = new DoNothing();
        new WaitForever(doNothing).start();
        new WaitForever(doNothing).start();
        new WaitForever(doNothing).start();
        Thread.sleep(100);
        doNothing.start();
        while(true) {
            Thread.sleep(10);
        }
    }


    static class WaitForever extends  Thread {

        private DoNothing doNothing;

        public WaitForever(DoNothing doNothing) {
            this.doNothing =  doNothing;
        }

        @Override
        public void run() {
            synchronized (doNothing) {
                try {
                    doNothing.wait(); // will wait forever here as nobody notifies here
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Unreachable Code");
            }
        }
    }

    static class DoNothing extends Thread {

        @Override
        public void run() {
            System.out.println("Do Nothing ");
        }
    } 
}

61
задан gsamaras 8 August 2016 в 22:45
поделиться

2 ответа

Как управляются переменные и память в Python.

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

Имеет ли он стек и кучу и какой алгоритм используется для управления памятью?

Когда мы говорим о CPython, он использует кучу private heap для хранения объектов. Из документации API CPython C :

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

Рекультивация памяти в основном обрабатывается подсчетом ссылок. То есть, Python VM хранит внутренний журнал о том, сколько ссылок ссылается на объект, и автоматически мусор собирает его, когда больше ссылок не ссылается на него. Кроме того, существует механизм разрыва круговых ссылок (который не может обрабатывать подсчет ссылок) путем обнаружения недоступных «островов» объектов, несколько в обратном порядке для традиционных алгоритмов GC которые пытаются найти все доступные объекты.

ПРИМЕЧАНИЕ: Пожалуйста, имейте в виду, что эта информация является CPython конкретной. Другие реализации python, такие как pypy, iron python, jython и другие, могут отличаться друг от друга и от CPython, когда дело доходит до их особенностей реализации. Чтобы понять это лучше, это может помочь понять, что между Python существует семантика (язык) и базовая реализация

. Учитывая это знание, существуют ли какие-либо рекомендации по управлению памятью для большого количества / data crunching?

Теперь я не могу говорить об этом, но я уверен, что NumPy (самая популярная библиотека python для хруста числа) имеет механизмы, которые обрабатывают память

Если вы хотите узнать больше о внутренних языках Python, посмотрите на эти ресурсы:

81
ответ дан user2357112 17 August 2018 в 22:43
поделиться
  • 1
    Хорошо, что вы подчеркиваете различие Python против CPython;) – phant0m 27 February 2013 в 19:31
  • 2
    Обратите внимание, что локальные переменные будут иметь фактические переменные, хранящиеся в эквиваленте фрейма стека. – Marcin 20 July 2013 в 19:45

Python не имеет любой такой вещи.

Python - это язык и не указывает, насколько точно реализованы реализации должен достичь семантики, определяемой языком Python.

Каждая реализация (CPython, PyPy, IronPython, Stackless , Jython ...) свободна в том, чтобы делать свое дело!

В C Python, все объекты живут в куче:

Управление памятью в Python включает в себя частную кучу, содержащую все объекты и структуры данных Python.1

Виртуальная машина CPython основана на стеках:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

Имейте в виду, что это специфичный для CPython. Стек не содержит фактических значений , хотя он сохраняет ссылки на эти объекты.

1: Источник

36
ответ дан phant0m 17 August 2018 в 22:43
поделиться
  • 1
    +1 для этого ответа помог мне узнать что-то новое о python! – NlightNFotis 27 January 2013 в 13:25
Другие вопросы по тегам:

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