Какова замена Контроллера. ReadFromRequest в ASP.NET MVC?

Есть несколько вещей о стеках потоков, о которых говорит спецификация Java . Среди прочего:

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

Теперь, если мы сосредоточимся на реализациях JVM, таких как HotSpot, мы можем получить дополнительную информацию. Вот несколько фактов, которые я собрал из разных источников:

  • Минимальный размер стека в HotSpot для потока кажется фиксированным. Это то, к чему относится вышеупомянутая опция -Xss. (Источник)

В Java SE 6 значение по умолчанию для Sparc равно 512k в 32-разрядной виртуальной машине и 1024k в 64-разрядной VM , ... Вы можете уменьшить размер стека, выполнив опцию -Xss. ... 64k - это наименьшее количество пространства стека, разрешенного для потока.

blockquote>
  • JRockit выделяет память отдельно от кучи, где расположены стеки. (Источник)

Обратите внимание, что JVM использует больше памяти, чем просто кучу. Например, методы Java, стеки потоков и собственные дескрипторы выделяются в памяти отдельно от кучи, а также внутренние структуры данных JVM.

blockquote>
  • Прямое сопоставление между Java Thread и родной OS Thread в HotSpot. (Источник) .
  • Но стек потоков Java в HotSpot управляется программным обеспечением, это не собственный поток стека ОС. (Источник)

Он использует отдельный стек программного обеспечения для передачи аргументов Java, в то время как собственный C-стек используется самой VM. Ряд внутренних переменных JVM, таких как счетчик программ или указатель стека для потока Java, хранятся в переменных C, которые не гарантируются всегда в аппаратных регистрах. Управление этими структурами интерпретатора программного обеспечения потребляет значительную долю общего времени выполнения.

blockquote>
  • JVM также использует тот же стек потока Java для собственных методов и вызовов времени выполнения JVM (например, загрузка классов) , (Источник) .
  • Интересно, что даже выделенные объекты иногда могут быть помещены в стек вместо кучи в качестве оптимизации производительности. (Источник)

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

blockquote>

И поскольку изображение стоит тысячи слов, вот один из Джеймс Блум


Теперь, отвечая на некоторые из ваших вопросов:

Как JVM знает, как могут быть созданы потоки?

blockquote >

Это не так. Легко доказывается противоречием, создавая переменное количество потоков. Это делает некоторые предположения о максимальным количеством потоков и размером стека для каждого потока. Вот почему у вас может быть нехватка памяти (а не память кучи памяти!), Если вы выделяете слишком много потоков.

Создает ли Java стек для каждого потока при его создании?

blockquote>

Как упоминалось ранее, поток каждой виртуальной машины Java имеет собственный стек виртуальной машины Java, созданный одновременно с потоком. (Источник) .

Если да, то где именно стек находится в памяти?

blockquote>

Как указано выше, спецификация Java позволяет хранить память стека на куче, технически говоря. Но, по крайней мере, JRockit JVM использует другую часть памяти.

Создает ли JVM стек из собственной памяти или предварительно выделяет раздел области управляемой памяти для стека?

blockquote>

Стек управляется JVM, потому что спецификация Java предписывает , как он должен себя вести: В стеке Java Virtual Machine хранятся фреймы (§2.6). Стек виртуальной машины Java аналогичен стеку обычного языка . Одним из исключений являются стеки Native Method, используемые для методов native. Подробнее об этом еще раз в в спецификации .

5
задан ArunPratap 19 March 2019 в 10:20
поделиться

3 ответа

Похож они добавили контроллер. UpdateModel для решения этой проблемы подпись:

UpdateModel(object model, string[] keys)

Я не обновил свое приложение лично, таким образом, я не уверен в фактическом использовании. Мне будет интересно узнавать об этом самому, поскольку я использую controller.ReadFromRequest также.

3
ответ дан 14 December 2019 в 19:31
поделиться

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

общедоступный статический класс MyBindingExtensions {

public static T ReadFromRequest < T > (this Controller controller, string key) 
{
    // Setup
    HttpContextBase context = controller.ControllerContext.HttpContext;
    object val = null;
    T result = default(T);

    // Gaurd
    if (context == null)
        return result; // no point checking request

    // Bind value (check form then query string)
    if (context.Request.Form[key] != null)
        val = context.Request.Form[key];
    if (val == null) 
    {
        if (context.Request.QueryString[key] != null)
            val = context.Request.QueryString[key];
    }

    // Cast value
    if (val != null)
        result = (t)val;

    return result;
}

}
2
ответ дан 14 December 2019 в 19:31
поделиться

Вы могли восстановить ту ссылку в чем-то как tinyurl.com?

Я нуждаюсь в этой информации также, но могу заставить ту мегассылку работать.

0
ответ дан 14 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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