Шаги в выделении памяти обрабатывают для объектов Java

Сам нашел решение, пропустил неявный импорт Вот полный пример кода:

import io.gatling.core.Predef.{constantUsersPerSec, rampUsersPerSec,_}
import io.gatling.core.structure.{PopulationBuilder, ScenarioBuilder}

import scala.concurrent.duration._

object Config {    
  val LOAD_FACTOR: Double = 50
  var RAMP_UP_TIME: Int = 10
  val RAMP_USER_PER_SEC = 0.1


  implicit class Extensions(val scenario: ScenarioBuilder) {
    def injectDefaults: PopulationBuilder =
      scenario.inject(
        rampUsersPerSec(RAMP_USER_PER_SEC) to LOAD_FACTOR during (RAMP_UP_TIME seconds),
        constantUsersPerSec(LOAD_FACTOR) during (DURATION seconds)
      )
  }

}
13
задан Pops 26 September 2012 в 20:43
поделиться

2 ответа

Давайте ступим через него:

SomeObject so1 = new SomeObject("some property value");

... на самом деле более сложно, чем это смотрит, потому что Вы создаете новую Строку. Могло бы быть легче думать как:

String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.

(Чтобы быть абсолютно точными - они не действительно эквивалентны. В оригинале 'новая Строка' создается во время компиляции и является частью изображения .class. Можно думать об этом как о взломе производительности.)

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

Затем JVM выделяет место для нового SomeObject. Это - немного пространства для внутренней бухгалтерии Java и пространства для каждого из полей объекта. В этом случае существует всего одно поле, strSomeProperty.

Примите во внимание это strSomeProperty просто ссылка на Строку. На данный момент это будет инициализировано к пустому указателю.

Затем, конструктор выполняется.

this.strSomeProperty = strSomeProperty;

Все это делает скопировать ссылку на Строку, в Ваш strSomeProperty поле.

Наконец, место выделено для ссылки на объект so1. Это установлено со ссылкой на SomeObject.

so2 работы точно таким же образом.

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

Определение Использования памяти в Java доктором Heinz M. Kabutz дает точный ответ плюс программа для вычисления использования памяти. Соответствующая часть:

  1. Класс поднимает по крайней мере 8 байтов. Так, если Вы говорите что новый Объект (); Вы выделите 8 байтов на "куче".
  2. Каждый элемент данных поднимает 4 байта, за исключением длинного и двойных, которые поднимают 8 байтов. Даже если элемент данных будет байтом, то он все еще поднимет 4 байта! Кроме того, используемый объем памяти увеличен в 8-байтовых блоках. Так, если у Вас есть класс, который содержит один байт, он поднимет 8 байтов для класса и 8 байтов для данных, в общей сложности 16 байтов (стон!).
  3. Массивы немного более умны. Примитивы упаковываются в массивах, поэтому если у Вас будет массив байтов, то они каждый поднимут один байт (ничего себе!). Использование памяти, конечно, все еще повышается в 8-байтовых блоках.

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

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

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