Go nie ma zbierania śmieci bez opóźnień. Jeśli możesz wskazać, gdzie są te roszczenia, chciałbym spróbować je poprawić.
Jedną z zalet, którą uważamy, że Go ma na Javie, jest większa kontrola nad układem pamięci. Na przykład prosty pakiet grafiki 2D może zdefiniować:
type Rect struct {
Min Point
Max Point
}
type Point struct {
X int
Y int
}
W programie Go, prostokąt jest tylko czterema liczbami całkowitymi ciągłymi w pamięci. Nadal możesz przekazać & r.Max do funkcji oczekującej * Point, to tylko wskaźnik do środka zmiennej Rect r.
W języku Java, równoważnym wyrażeniem byłoby utworzenie klas Rect i Point, w którym to przypadku pola Min i Max w Rect byłyby wskaźnikami do oddzielnie przydzielonych obiektów. Wymaga to większej ilości przydzielonych obiektów, zajmowania większej ilości pamięci i dawania garbage collectorowi więcej możliwości śledzenia i więcej zadań do wykonania. Z drugiej strony unika się konieczności tworzenia wskaźnika na środku obiektu.
W porównaniu z Javą, program Go zapewnia programistom większą kontrolę nad układem pamięci i można go użyć do zmniejszenia obciążenia kolektora. Może to być bardzo ważne w programach z dużą ilością danych. Kontrola układu pamięci może być również ważna dla wydobywania wydajności ze sprzętu ze względu na efekty pamięci podręcznej i takie, ale jest to styczne do pierwotnego pytania.
Kolekcjoner w bieżących dystrybucjach Go jest rozsądny, ale w żadnym razie nie najnowocześniejszy. Mamy plany, aby wydać więcej wysiłku, aby poprawić go w ciągu następnego roku lub dwóch. Żeby było jasne, śmieciarz z firmy Go nie jest tak dobry jak współczesne śmieciarki Java, ale uważamy, że w Go łatwiej jest pisać programy, które nie wymagają tak dużej ilości odśmieceń, aby efekt netto był nadal możliwy. to usuwanie śmieci jest mniejszym problemem w programie Go niż w równoważnym programie Java.
W grach w Javie nigdy nie pozwolę, aby garbage collector działał, dopóki nie zostanie osiągnięty odpowiedni punkt w grze (np. Menu pauzy). Aby to osiągnąć, zawsze miałbym jakąś klasę menedżerską, która zachowuje referencje do wszystkich utworzonych obiektów i zwalnia je wszystkie po osiągnięciu menu pauzy lub końca poziomu. –
Może Ci się to podobać w porównaniu. http://code.google.com/p/jgo/ Jeśli program Go obsługuje strukturę 'struct', może to potencjalnie całkowicie uniknąć GC zamiast mieć nadzieję, że JIT zrobi to za Ciebie. –
@ JonTaylor Dlaczego to zrobiłeś? z powodu wydajności śmieciarek JVM lub czegoś innego? –