2014-09-18 14 views
12

To tylko proste teoretyczne pytanie z ciekawości. Zawsze byłam jak fanka java. Ale jedna rzecz sprawia, że ​​zastanawiam się, dlaczego java nie zapewnia mechanizmu do tworzenia obiektów na stosie? Czy nie byłoby bardziej wydajne, gdybym mógł po prostu utworzyć mały obiekt Point (int x, int y) na stosie zamiast sterty, jak tworzenie struktury na C#. Czy istnieje jakiś specjalny powód bezpieczeństwa związany z tym ograniczeniem w java? :)Tworzenie obiektów w pamięci stosów w java?

+1

Co stanie się, gdy umieścisz go w pojemniku, którego nie ma na stosie? Po powrocie kontener ma teraz odniesienie do zwalnianej pamięci. – Max

+1

@Max: prawdopodobnie język musiałby również zawierać konstrukcje, które pozwalają kompilatorowi sprawdzić to. – Thilo

+0

@Max: Kontener nie ma odniesienia do oryginału, ma kopię lub jego kopię w pudełku. .NET/C# ma to od 15 lat. https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – csauve

Odpowiedz

15

Strategia polega na tym, że zamiast przenosić tę decyzję na język, Java pozwala JVM/Hotspot/JIT/runtime decydować gdzie i jak chce przydzielić pamięć.

Prowadzone są badania w celu wykorzystania "analizy ucieczki", aby dowiedzieć się, jakie obiekty faktycznie nie muszą iść na stertę, a zamiast tego umieszczać je w stosach. Nie jestem pewien, czy udało się to już w maszynie JVM mainstrem. Ale jeśli tak, będzie kontrolowany przez środowisko wykonawcze (rzecz -XX: coś), a nie programista.

Plusem tego jest to, że nawet stary kod może korzystać z tych przyszłych ulepszeń, nie aktualizując się.

Jeśli chcesz ręcznie zarządzać tym (ale nadal masz kompilator sprawdzić, że pozostaje "bezpieczny"), spójrz na Rust.

+4

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html włączone w 6u23 i później – jtahlborn

+1

@jtahlborn: +1. Myślę, że obecny zbiór optymalizacji nie idzie tak daleko, jak faktycznie przydziela obiekty na stosie. Z informacji o wydaniu brzmi to jak wyeliminowanie blokad i nadmiarowych kopii istniejących obiektów. – Thilo

+0

+1 z linku jtahlborn opublikowane: "Nie zastępuje alokacji sterty przy alokacji stosu dla nieulotnych obiektów." co oznacza, że ​​* ArgEscape * i * NoEscape * zostaną przydzielone na stosie. Ale potem znowu, nie jest to wyraźnie wymienione ... – alfasin

2

Powszechnym problemem byłoby zainicjowanie niektórych odniesień globalnych za pomocą obiektu utworzonego na stosie. Kiedy metoda, która stworzyła obiekt, kończy się, o czym mówisz?

To, że wymieniony obiekt jest tworzony na stosie w Javie, jest po prostu robione za plecami za pomocą escape analysis, co zapewnia, że ​​powyższy scenariusz nie występuje.

4

To będzie wstępnie przychodzić do Javy, nie ma prawdziwego ETA ustawić dla tego więc można tylko nadzieję, że pochodzą od Java 10.

Propozycja nazywa typów wartości i można go in the mailing list of Project Valhalla naśladowania.

Nie wiem, czy były jakieś wcześniejsze powody, dla których nie było w języku w pierwszej kolejności, może pierwotnie uważano, że jest niepotrzebny lub po prostu nie ma czasu na wdrożenie tego.

+0

W porządku! Java "wstępnie" dogoni C#? "Sometime" (tm) – csauve

+0

@skiwi Czy możesz krótko wyjaśnić, czym są typy wartości? –