Сам нашел решение, пропустил неявный импорт Вот полный пример кода:
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)
)
}
}
Давайте ступим через него:
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
работы точно таким же образом.
Определение Использования памяти в Java доктором Heinz M. Kabutz дает точный ответ плюс программа для вычисления использования памяти. Соответствующая часть:
- Класс поднимает по крайней мере 8 байтов. Так, если Вы говорите что новый Объект (); Вы выделите 8 байтов на "куче".
- Каждый элемент данных поднимает 4 байта, за исключением длинного и двойных, которые поднимают 8 байтов. Даже если элемент данных будет байтом, то он все еще поднимет 4 байта! Кроме того, используемый объем памяти увеличен в 8-байтовых блоках. Так, если у Вас есть класс, который содержит один байт, он поднимет 8 байтов для класса и 8 байтов для данных, в общей сложности 16 байтов (стон!).
- Массивы немного более умны. Примитивы упаковываются в массивах, поэтому если у Вас будет массив байтов, то они каждый поднимут один байт (ничего себе!). Использование памяти, конечно, все еще повышается в 8-байтовых блоках.
Как люди указали в комментариях, Строки являются особым случаем, потому что они могут быть интернированы. Можно рассуждать о пространстве, которое они поднимают таким же образом, но имеют в виду, что то, что похоже на несколько копий той же Строки, может на самом деле указать на ту же ссылку.