Сколько памяти занимает логическое значение в Java

Обновлено: 02.07.2024

Как и в C и Pascal, в Visual Basic есть целый ряд типов данных. Их диапазон зависит от их формата (например, символов, целых чисел и значений с плавающей запятой) и количества байтов, используемых для их хранения. В таблице 19.2 представлены основные предопределенные (внутренние) типы данных. Пользовательский тип также можно определить с помощью оператора Type.

Таблица 19.2. Типы данных

< td >0 to 255< td >±3,402823×10 38 до ± 1,401298×10 −45< /таблица>

Существует два вида строк:

Строки переменной длины: могут содержать до 2 147 483 648 (2 31) символов (или 65 536 для MicrosoftWindows версии 3.1 и более ранних версий).

Строки фиксированной длины: могут содержать до 65 536 символов (2 16 ).

Графики сценариев, примененные к сетевой безопасности

Жаннет М. Винг, Информационная гарантия, 2008 г.

Система обнаружения вторжений

Мы связываем логическую переменную с каждым действием, абстрактно представляя, может ли IDS обнаружить это конкретное действие. Действия классифицируются как обнаруживаемые или скрытые по отношению к IDS. Если действие можно обнаружить, оно вызовет тревогу при выполнении на хосте или в сегменте сети, контролируемом IDS; если действие скрыто, IDS его не увидит.

Мы задаем IDS как функцию ids: H × H × A→ d, s, b>, где ids(h 1, h2,a) = d, если действие a d может быть обнаружен при выполнении с исходным хостом h1 и целевым хостом h 2; идентификаторы(h1, h2,a) = s, если действие a скрыто при выполнении с исходным хостом h1 и целевым хостом ч2; и идентификаторы(h1, h2, a em>) = b, если действие a имеет bобнаруживаемый и скрытый штаммы, и успех в обнаружении действия зависит от того, какой штамм используется. Когда h1 и h2 ссылаются на один и тот же хост, id(< em>h1, h2, a) указывает компонент IDS (если есть) находится на этом хосте. Когда h1 и h2 ссылаются на разные хосты, id(h1, h2, a) указывает мониторинг компонента IDS (если есть). сетевой путь между h1 и h2.

Качественное моделирование и симуляция развивающихся регуляторных сетей

Хидде Де Йонг, . Денис Тиффри, О росте, форме и компьютерах, 2003 г.

6.3.2 Качественный анализ с использованием обобщенных логических моделей

Начиная с 1970-х годов несколько авторов предложили еще больше упростить описание регуляторных сетей за счет использования булевой алгебры (Kauffman, 1969, 1993; Thomas, 1973, 1991). В этом контексте продукт гена будет считаться присутствующим (отсутствующим), когда его концентрация или активность превышает (остается ниже) определенный пороговый уровень. Взаимодействия между генами затем можно формализовать с помощью логических уравнений вида:

где vi — логическая переменная, представляющая активность гена i, bi : n → логическая функция и v = [v1,…, vn] T переменные, связанные с генами в сети. В большинстве моделей авторы рассматривали эти уравнения в предположении синхронности, т. е. вычислении vi(t + 1) в терминах < em>v(t) выполняется синхронно для всех i. Это допущение часто приводит к артефактам моделирования, которых можно избежать, учитывая определенные задержки для каждого изменения значения (в сторону увеличения или уменьшения) переменной. Однако во многих ситуациях логическое представление чрезмерно упрощает моделируемую систему, что приводит к потере важной качественной информации и препятствует получению биологически значимых результатов. Это понимание побудило Томаса обобщить логический подход, чтобы:

при необходимости используйте многоуровневые переменные (например, переменные, принимающие значения 0, 1, 2,…)

явно учитывать пороговые значения (обозначаемые как s 1 , s 2 ,…)

определить логические параметры для замены логических операторов

рассматривать изменения значений с учетом предположения об асинхронности.

В контексте этого обобщенного логического подхода система регулирования может достигать обычных логических состояний, т. е. состояний с целочисленными значениями, или единственных логические состояния, т.е. состояния, расположенные на одном или нескольких порогах (Томас, 1991). В сети на рис. 6.1 различаются две переменные, va и vb, каждая из которых может принимать на значениях s 1 , 1, s 2 , 2>. Примерами обычных логических состояний являются 00 и 12, а 0 s 1 и s 1 s 2 — экземпляры единичных логических состояний.

Рисунок 6.8. Обобщенная логическая модель для примерной сети на рис. 6.1. (а) Регуляторная матрица для сети, (б) Таблица состояний, определяющая скорость экспрессии генов (логические функции Fa и Fb) с точки зрения логических параметров (Ks). (c) Таблица состояний для определенных значений логических параметров, соответствующих моделированию на рисунке 6.7. (d) Представление логических состояний и их взаимных переходов в фазовом пространстве, полученное с параметрами в (c).

Важное различие между обобщенной логической моделью и кусочно-линейной моделью, представленной выше, заключается в обработке комбинаций взаимодействий, регулирующих общий ген-мишень. Здесь логические параметры представляют собой общий способ представления всех возможных ситуаций (таких как отношения И, ИЛИ или исключающее ИЛИ) в терминах конкретных комбинаций значений для четко определенного набора логических параметров. Изменение значений некоторых логических параметров перед вычислением таблицы состояний привело бы к другой динамике и (возможно) к другой конфигурации аттрактора. Чтобы получить некоторые из этих динамических характеристик с помощью кусочно-линейной модели, может потребоваться изменить структуру самих уравнений. Таким образом, обобщенная логическая модель более гибкая, хотя и достигается за счет определения большего количества параметров (каждый из которых может принимать ограниченное количество логических значений).

Важным результатом обобщенной логической формализации является возможность вычисления конкретных ограничений значений параметров для любой заданной цепи обратной связи (т. е. замкнутой цепи взаимодействий) для создания конкретных динамических свойств (Томас и д'Ари, 1990; Томас < em>et al., 1995). Действительно, можно показать, что при правильных значениях параметров положительные схемы (с четным числом отрицательных взаимодействий) порождают мультистационарность, тогда как отрицательные схемы (с нечетным числом отрицательных взаимодействий) может генерировать гомеостаз, возможно, в форме затухающих или незатухающих колебаний. Для выбранных значений параметров моделирование на рис. 6.8 соответствует ситуации, когда все три цепи (одна положительная двухэлементная и две отрицательные автоингибиторные цепи) функционируют, что приводит к комбинации мультистационарности (действительно есть два устойчивых состояния и одно нестабильное). состояние) и гомеостаз (в каждом из двух устойчивых состояний одна из переменных имеет пороговое значение).

В более общем плане в контексте обобщенного логического формализма возможно:

для заданных значений параметров проверить потенциальную динамическую роль (или функциональность) каждой цепи обратной связи

вычислить ограничения параметров, чтобы сделать любую (комбинацию) схем одновременно функциональной

для аналитического вычисления ограничений параметров таким образом, чтобы система имела определенное (набор) устойчивое состояние(я)

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

С вычислительной точки зрения наш логический подход принимает форму серии классов Java, которые вместе называются GIN-sim (Chaoiya et al., 2002). На современном этапе полностью реализованы как синхронные, так и асинхронные средства моделирования.Начиная с набора начальных условий, GIN-sim генерирует граф последовательностей логических состояний (каждое из которых описывает уровни различных продуктов регулирования), качественно представляющих все разрешенные переходы состояний, соответствующие структуре сети, закодированной в исходном графе регулирования. Начальные условия и значения параметров могут быть определены пользователем или по умолчанию, включая количество различных уровней для каждого регуляторного продукта и качественные веса различных комбинаций взаимодействий для каждого гена.

На данный момент наш прототип программного обеспечения считывает граф взаимодействия и определения пользовательских параметров из простого текстового файла и выдает результаты моделирования в виде графа последовательности состояний, записанного в другом текстовом файле ( Chaouiya и др.., 2002). Эти файлы должны вскоре перейти к стандарту Graph XML. На данный момент мы принимаем стандарт GML (язык моделирования графов), который является прародителем почти всех основанных на XML стандартов для графов. Эти файлы могут обрабатываться серией графических библиотек Java, что позволяет пользователю визуализировать, редактировать и форматировать два типа графиков.

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

boolean представляет один бит информации, но его "размер" не является чем-то точно определенным.

Мне пришел в голову вопрос, почему логическое значение в java не может быть представлено 1 битом (или 1 байтом, если байт является минимальным представлением)?

JVM использует 32-битную ячейку стека, используемую для хранения локальных переменных, аргументов метода и значений выражений. Примитивы размером менее 1 ячейки заполняются, примитивы размером более 32 бит (длинные и двойные) занимают 2 ячейки

Означает ли это, что даже типы данных byte/char/short primitiva также занимают 32 бита, хотя их размер определен как 8/16/16 бит?

Можем ли мы также сказать, что логический размер будет 32-битным на 32-битном процессоре и 64-битным на 64-битном процессоре?

Означает ли это, что даже типы данных byte/char/short primitiva также занимают 32 бита, хотя их размер определен как 8/16/16 бит? -- Да.

Можем ли мы также сказать, что логический размер будет 32-битным на 32-битном процессоре и 64-битным на 64-битном процессоре? -- Нет. Размер определяется JVM.

@RobertHarvey Если примитивные типы данных byte/char/short также занимают 32 бита, то какой смысл определять их размер как 8/16/16 бит в java?

2 ответа 2

TL;DR Единственное, в чем можно быть уверенным, так это в том, что логическое значение занимает как минимум один бит. Все остальное зависит от реализации JVM.

Спецификация языка Java не определяет размеры, только диапазоны значений (см. Спецификацию языка). Таким образом, на этом уровне не определен не только логический размер. И логическое значение имеет два возможных значения: false и true .

Спецификация виртуальной машины говорит нам, что логические переменные обрабатываются как int со значениями 0 и 1. Только массивы логических значений имеют специальную поддержку. Таким образом, на уровне виртуальной машины логическая переменная занимает тот же объем пространства, что и int , что означает одну ячейку стека: не менее 4 байтов, обычно 4 байта в 32-разрядной версии Java и 8 байтов в 64-разрядной версии.

Наконец, есть движок HotSpot, который компилирует байт-код JVM в оптимизированный машинный код для конкретного ЦП, и я уверен, что во многих случаях он способен вывести ограниченный диапазон значений логического значения с маской int из контекста и использовать меньший размер .

Как Роберт, и вы также косвенно сказали, что если примитивные типы данных byte/char/short также принимают 32 бита, то мой вопрос заключается в том, какой смысл определять их размер как 8/16/16 бит в java?

Точка определения их ограниченного диапазона значений (или «размера», если хотите) — это их семантика, например. колеблется от 127 до -128. Часто это нежелательно, но иногда полезно. А еще есть массивы более коротких типов, и они действительно занимают меньше места, чем массивы int. И, наконец, есть потенциал JIT-компилятора/движка HotSpot для оптимизации пространства до менее чем 4 байтов.

Существует ряд понятий, которые следует разобрать:

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

Java, язык программирования, не определяет понятие размера примитивных типов, потому что (в отличие от C/C++) здесь нет оператора sizeof : размеры нельзя наблюдать с помощью языковых конструкций, поэтому язык не нужно их определять.

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

Язык определяет возможность инструментирования, которая позволяет запрашивать размер объекта, но (1) для этого требуется инструментирование, (2) предоставляет только оценку и (3) этот запрос не применяется к примитивным типы или локальные переменные.

JVM использует 32-битную ячейку стека, используемую для хранения локальных переменных, аргументов метода и значений выражений. Примитивы размером менее 1 ячейки заполняются, примитивы размером более 32 бит (длинные и двойные) занимают 2 ячейки

Дополнительная цитата говорит о деталях формата файла класса JVM, который используется в качестве механизма обмена (в отличие от языка Java и реализации JVM). Хотя то, что он говорит, верно для абстрактной машины и байт-кода JVM, это не обязательно должно быть справедливо для машинного кода JIT.

Дополнительная цитата также ограничивается обсуждением локальных переменных/параметров/выражений, которые обычно размещаются в стеке (например, auto или Automatics в C/C++), и не обсуждает объекты/массивы.

Фактический размер таких автоматических переменных почти никогда не является проблемой (например, для производительности или для места).

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

(Мы можем рассматривать рекурсию как масштабирование локальных переменных, поэтому более крупные локальные переменные в рекурсивных процедурах рискуют переполнить стек раньше.)

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

Означает ли это, что даже типы данных byte/char/short primitiva также занимают 32 бита, хотя их размер определен как 8/16/16 бит?

Возможно, для местных жителей, а может и не в зависимости от JIT.

Для объектов в рамках механизма байт-кода и файлов классов JVM доступ к полям осуществляется напрямую по их идентификации, и понятие «ячейки» не дается, в отличие от переменных (локальных и параметрических).

Я искал везде, но ничего не нашел о реальном размере примитивного логического типа, используемого java. Может ли кто-нибудь помочь мне, пожалуйста?

Комментарии

Обычно они обрабатываются как 'int' — см. последнее предложение ниже из Спецификации виртуальной машины Java

2.3.4 Логический тип

Хотя виртуальная машина Java определяет логический тип, она предоставляет для него
очень ограниченную поддержку. Инструкций виртуальной машины Java, предназначенных исключительно
для операций над логическими значениями, не существует. Вместо этого выражения на языке программирования Java
, работающие с булевыми значениями, компилируются для использования значений
типа данных int виртуальной машины Java.
Виртуальная машина Java напрямую поддерживает логические массивы. Его инструкция newarray
(§newarray) позволяет создавать логические массивы. Доступ к массивам типа
boolean и их изменение осуществляются с помощью инструкций байтовых массивов baload и
bastore (§baload, §bastore).

В реализации виртуальной машины Java от Oracle логические массивы в языке программирования Java
кодируются как массивы байтов виртуальной машины Java с использованием 8 бит на
логический элемент.
Виртуальная машина Java кодирует Булевы компоненты массива, использующие 1 для представления
true и 0 для представления false. Когда логические значения языка программирования Java
сопоставляются компиляторами со значениями типа int виртуальной машины Java, компиляторы
должны использовать ту же кодировку.

И см. 2.11.1 Типы и виртуальная машина Java

Обратите внимание, что большинство инструкций в таблице 2.2 не имеют форм для целочисленных типов
byte, char и short. Ни у кого нет форм для логического типа. Компилятор
кодирует множество литеральных значений типов byte и short, используя инструкции Java Virtual Machine
, которые расширяют эти значения до значений типа int во время компиляции
или во время выполнения. Загрузка литеральных значений типов boolean и char кодируется с использованием
инструкций, которые расширяют литерал до значения типа int во время компиляции или
во время выполнения.Аналогично, загрузки из массивов значений типа boolean, byte, short и
char кодируются с помощью инструкций виртуальной машины Java, которые расширяют знак или обнуляют

расширить значения до значений типа int. Таким образом, большинство операций над значениями фактических
типов boolean, byte, char и short корректно выполняются инструкциями,
работающими со значениями вычислительного типа int.

Объявление. Раздел "Курсы" будет удален до 20 марта. Пожалуйста, завершите все текущие курсы к тому времени.

Вы используете устаревший браузер. Обновите браузер или активируйте Google Chrome Frame, чтобы вам было удобнее.

Две вещи, которые каждый Java-разработчик должен знать о логических значениях

adminguy


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

Вы создавали такой логический объект?

Это простая строка кода, которая создает логический объект. В этом нет ничего явно плохого, но посмотрите и подумайте немного усерднее; что, если ваше программное обеспечение создало миллион логических объектов? Не будет ли это расточительством? В конце концов, есть только два логических значения: true и false, так почему бы просто не создать две константы и не использовать их миллион раз? Это, безусловно, сэкономит все циклы, необходимые для создания такого количества избыточных объектов.

Чтобы сделать нашу жизнь еще проще, класс Boolean предоставляет нам две стандартные константы: Boolean.TRUE и Boolean.FALSE. Вместо создания объектов просто используйте эти константы, как показано в примере кода 2, и сделайте свою программу немного лучше и быстрее.

Булево значение b = логическое значение.FALSE ;

Логично думать, что логическое примитивное значение займет 1 бит памяти, и, к сожалению, это заблуждение, на которое поверили многие Java-разработчики. Логические значения в Java почти всегда занимают больше, чем немного — значительно больше.

Нет инструкций виртуальной машины Java, предназначенных исключительно для операций с логическими значениями. Вместо этого выражения на языке программирования Java, работающие с логическими значениями, компилируются для использования значений типа данных int виртуальной машины Java. -- Спецификация виртуальной машины Java

Это означает, что логические значения всегда занимают более одного байта, но сколько больше зависит от того, где хранится значение: в стеке или в куче.

JVM использует 32-битную ячейку стека, поэтому каждое логическое значение будет занимать всю 32-битную ячейку стека. Однако размер логических значений в куче зависит от реализации. Семантика хранения объектов и данных в куче подпадает под правила «частной реализации» JVM. Это означает, что реализация JVM может выбирать размер логических значений в куче.

Однако логические массивы кодируются как массивы байтов, что дает 8 бит каждому логическому элементу массива:

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

Читайте также:

Тип данныхРазмер хранилищаДиапазон
Байт1 байт
Boolean2 байтаTrue или False
Целое число2 байта−32 768 до 32 767
Long (длинное целое число) 4 байта−2 147 483 648 – 2 147 483 647
Single (одинарная точность с плавающей запятой)4 байта
Double (двойная точность с плавающей запятой)8 байт ±4,94065645841247×10 от −324 до ±1,79769313486232×10 308
Денежная единица (масштабированное целое число)8 байт ±922 337 203 685 477,5808
Дата8 байтс 1 января 100 года по 31 декабря 9999 года.
Строка (переменной длины)10 байт + длина строкиот 0 до примерно 2 миллиардов
Строка (фиксированной длины)Длина строки1 до приблизительно 65 400