Какова память наверху метода Java?

В классе Foo вы можете поместить аннотации @Getter и @Setter в класс, чтобы избежать дублирования (обратите внимание, что если вы добавляете в этот класс другие закрытые атрибуты, которые не могут быть публичными, вы должны удалить аннотацию @Getter, чтобы выставить атрибут private):

@Getter
@Setter
public class Foo

О методе getWithBytesAndValues ​​я предлагаю вам поместить этот метод в класс Foo, потому что этот метод позволяет получить атрибуты Foo и установить другие атрибуты Foo (бизнес-правило взято из домена Foo - см. Дизайн, управляемый доменом). Вы также можете разделить внутреннюю логику двумя способами:

public class Foo {

...

    public void setBytes()
        setByte1();
        setByte2();
    }

    private void setByte2() {
        if (getByte2String() != null) {
            setByte2(new Base64(getByte2String()).decode());
            if (getByte2Value() == null) {
                setByte2Value(DEFAULT_BYTE_VALUE);
            }
        }
    }

    private void setByte1() {
        if (getByte1String() != null) {
            setByte1(new Base64(getByte1String()).decode());
            if (getByte1Value() == null) {
                setByte1Value(DEFAULT_BYTE_VALUE);
            }
        }
    }
}
13
задан unwind 8 April 2009 в 14:40
поделиться

7 ответов

Служебные расходы ... нет.

Определение метода и адрес кода хранятся в объекте Class, который имеет уникальный экземпляр, на который указывает каждый экземпляр вашего объекта. Поскольку это было бы так, независимо от того, добавили ли вы этот метод, накладные расходы для каждого отдельного объекта - ничто.

11
ответ дан 1 December 2019 в 22:58
поделиться

As a few other people at least have said, the method is not stored in the serialization.

You can easily do a test to show this in this example with the following code.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class SerializationTest {

    public static void main(String[] args) {
        serialize(true);
        serialize(false);
    }

    public static void serialize(boolean aOrB) {
        FileOutputStream fos = null;
        ObjectOutputStream out = null;
        try {
            fos = new FileOutputStream("output.txt");
            out = new ObjectOutputStream(fos);
            out.writeObject(aOrB ? new A() : new B());
            out.close();
            fos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        File file = new File("output.txt");
        System.out.println(file.length());
    }

    public static class A implements Serializable {
        int a = 0;
    }

    public static class B implements Serializable {
        int a = 0;

        public int foo(int a) {
            return a;
        }
    }
}

For me this prints out

48
48
2
ответ дан 1 December 2019 в 22:58
поделиться

80 байт, поскольку метод не включен в объект. Если только вы не говорите о типе «vtable», в этом случае, вероятно, 160 байт.

Уточнение по 160 байтам. 160 было бы, если бы каждый объект выделил свою собственную vtable (что является одной из возможных реализаций) В качестве альтернативы (и, как указано в комментариях), лучшим способом будет один vtable на класс, что будет означать 80 + размер указателя на vtable (вероятно, 4 или 8 байтов в зависимости от виртуальной машины). Итак, 84 или 88 байт.

Все это полностью зависит от того, как виртуальная машина выделяет память и работает с неконечными методами. Не зная, как реализована конкретная виртуальная машина, ни на один вопрос нельзя ответить правильно.

4
ответ дан 1 December 2019 в 22:58
поделиться

Метод не сохраняется в сериализованной форме. Это так просто.

Редактировать: Что касается объектов в ВМ во время выполнения, размер должен быть постоянным, независимо от того, сколько методов имеет класс объекта.

1
ответ дан 1 December 2019 в 22:58
поделиться

Объекты обоих классов будут использовать около 20-24 байтов для 32/64-битных JVM.

2
ответ дан 1 December 2019 в 22:58
поделиться

Python 2.7

Официальная документация для HTMLParser : Python 2.7

>>> import HTMLParser
>>> pars = HTMLParser.HTMLParser()
>>> pars.unescape('© €')
u'\xa9 \u20ac'
>>> print _
© €

Python 3

Официальная документация для HTMLParser :

-1
ответ дан 1 December 2019 в 22:58
поделиться

Равно 80! (вкратце)

1
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

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