Twój kolega nie ma pojęcia o czym mówi.
Twoja najdroższa operacja będzie ich słuchać . Zmarnowali czas na przekręcanie cię na informacje, które są ponad dziesięć lat nieaktualne (od pierwotnej daty opublikowano tę odpowiedź), a także na poświęcanie czasu na pisanie tutaj i poszukiwanie prawdy w Internecie.
Miejmy nadzieję, że po prostu ignorują coś, co słyszeli lub czytali ponad dziesięć lat temu i nie wiedzą nic lepszego. Przyjęłbym również wszystko, co powiedzą, jako podejrzane, powinien to być dobrze znany błąd każdego, kto i tak jest na bieżąco.
Wszystko jest przedmiotem (oprócz primitives
)
Wszystko inne niż prymitywy ( int, long, double
itp.) To Obiekty w Javie. Nie ma możliwości uniknięcia tworzenia obiektów w Javie.
Tworzenie obiektów w Javie ze względu na strategie alokacji pamięci jest w większości przypadków szybsze niż C ++ i ze względów praktycznych w porównaniu do wszystkiego innego w JVM można uznać za „wolne” .
Na początku lat dziewięćdziesiątych na początku lat 2000. implementacje JVM miały pewne narzuty wydajności w rzeczywistej alokacji obiektów. Nie było tak od co najmniej 2005 roku.
Jeśli dostroisz się, -Xms
aby obsługiwać całą pamięć potrzebną do poprawnego działania aplikacji, GC może nigdy nie być zmuszona do uruchomienia i zamiatania większości śmieci w nowoczesnych implementacjach GC, programy krótkotrwałe mogą nigdy nie być GC.
Nie próbuje zmaksymalizować wolnego miejsca, które i tak jest czerwonym śledziem, maksymalizuje wydajność środowiska wykonawczego. Jeśli to oznacza, że JVM Heap jest przydzielany prawie w 100% przez cały czas, niech tak będzie. Wolna pamięć sterty JVM i tak niczego nie daje.
Istnieje błędne przekonanie, że GC zwalnia pamięć z powrotem do reszty systemu w użyteczny sposób, jest to całkowicie nieprawda!
Sterta JVM nie rośnie i nie kurczy się, więc na resztę systemu pozytywnie wpływa wolna pamięć w stercie JVM . -Xms
alokuje WSZYSTKO, co jest określone podczas uruchamiania, a jego heurystyka polega na tym, że tak naprawdę nigdy nie zwalnia żadnej pamięci z powrotem do systemu operacyjnego, aby mogła być współdzielona z innymi procesami systemu operacyjnego, dopóki ta instancja JVM nie zakończy się całkowicie. -Xms=1GB -Xmx=1GB
przydziela 1 GB pamięci RAM, niezależnie od liczby obiektów faktycznie utworzonych w danym momencie. Istnieją pewne ustawienia, które pozwalają na zwolnienie procentu pamięci sterty, ale dla wszystkich praktycznych celów JVM nigdy nie jest w stanie zwolnić wystarczającej ilości tej pamięci, aby to się kiedykolwiek wydarzyłowięc żadne inne procesy nie mogą odzyskać tej pamięci, więc reszta systemu nie korzysta z uwolnienia JVM Heap. Zapytanie RFE zostało „przyjęte” 29 listopada 2006 r., Ale nic z tym nie zrobiono. Takie zachowanie nie jest uważane za problem przez nikogo z autorytetów.
Istnieje błędne przekonanie, że tworzenie wielu małych, krótkotrwałych obiektów powoduje, że JVM zatrzymuje się na długi okres czasu, jest to również nieprawda
Obecne algorytmy GC są w rzeczywistości zoptymalizowane do tworzenia wielu wielu małych obiektów, które są krótkotrwałe, to jest w zasadzie 99% heurystyka dla obiektów Java w każdym programie. Próby łączenia obiektów powodują, że JVM działa gorzej w większości przypadków.
Jedynymi obiektami, które wymagają dziś pulowania, są obiekty odnoszące się do skończonych zasobów, które są zewnętrzne w stosunku do JVM; Gniazda, pliki, połączenia z bazą danych itp. Mogą być ponownie użyte. Zwykłe przedmioty nie mogą być łączone w taki sam sposób, jak w językach, które pozwalają na bezpośredni dostęp do miejsc pamięci. Buforowanie obiektów jest inną koncepcją i może być, lub nie, to, co niektórzy naiwnie nazywają pulowaniem , te dwie koncepcje nie są tym samym i nie należy ich łączyć.
Współczesne algorytmy GC nie mają tego problemu, ponieważ nie zwalniają zgodnie z harmonogramem, zwalniają, gdy w danym pokoleniu potrzebna jest wolna pamięć. Jeśli sterta jest wystarczająco duża, wówczas nie następuje dezalokacja na tyle długo, aby spowodować przerwy.
Języki dynamiczne zorientowane obiektowo pokonują C nawet teraz w testach wrażliwych na obliczenia.