में ऑब्जेक्ट्स लाइफेंस मैं "सी # के माध्यम से सीएलआर" पढ़ रहा था और ऐसा लगता है कि इस उदाहरण में, ऑब्जेक्ट जिसे 'ओबीजे' को सौंपा गया था, लाइन 1 के बाद कचरा संग्रह के लिए पात्र होगा, बाद में नहीं लाइन 2.जावा बनाम .NET
void Foo()
{
Object obj = new Object();
obj = null;
}
क्योंकि स्थानीय चर उम्र गुंजाइश है जिसमें यह परिभाषित किया गया था द्वारा नहीं परिभाषित है यही कारण है, लेकिन पिछली बार से आप इसे पढ़ सकते हैं।
तो मेरा सवाल है: जावा के बारे में क्या? मैंने इस तरह के व्यवहार की जांच करने के लिए इस कार्यक्रम को लिखा है, और ऐसा लगता है कि ऑब्जेक्ट जिंदा रहता है। मुझे नहीं लगता कि जेवीएम के लिए बाइटकोड की व्याख्या करते समय परिवर्तनीय जीवनकाल को सीमित करना संभव है, इसलिए मैंने विधि संकलन को बल देने के लिए 'जावा-एक्सकंप' के साथ प्रोग्राम चलाने की कोशिश की, लेकिन 'अंतिमकरण' को वैसे भी नहीं कहा जाता है। ऐसा लगता है कि जावा के लिए यह सच नहीं है, लेकिन मुझे आशा है कि मैं यहां एक और सटीक उत्तर प्राप्त कर सकता हूं। इसके अलावा, एंड्रॉइड के दलविक वीएम के बारे में क्या?
class TestProgram {
public static void main(String[] args) {
TestProgram ref = new TestProgram();
System.gc();
}
@Override
protected void finalize() {
System.out.println("finalized");
}
}
जोड़ा गया: जेफरी रिक्टर "सी # के माध्यम से CLR" में कोड उदाहरण देता है, कुछ इस तरह:
public static void Main (string[] args)
{
var timer = new Timer(TimerCallback, null, 0, 1000); // call every second
Console.ReadLine();
}
public static void TimerCallback(Object o)
{
Console.WriteLine("Callback!");
GC.Collect();
}
TimerCallback एमएस नेट पर केवल एक बार कहा जाता है, तो परियोजनाओं लक्ष्य है 'रिलीज' (घड़ी जीसी। कोलेक्ट() कॉल के बाद नष्ट कर दिया गया है, और यदि लक्ष्य 'डीबग' है तो प्रत्येक सेकेंड को बुलाया जाता है (वेरिएबल जीवनकाल बढ़ता है क्योंकि प्रोग्रामर डीबगर के साथ ऑब्जेक्ट तक पहुंचने का प्रयास कर सकता है)। लेकिन मोनो कॉलबैक पर हर सेकेंड कहा जाता है इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे संकलित करते हैं। ऐसा लगता है कि मोनो के 'टाइमर' कार्यान्वयन स्टोर थ्रेड पूल में कहीं उदाहरण के संदर्भ में हैं। एमएस कार्यान्वयन ऐसा नहीं करता है।
मैं जावा स्पेक में इसे खोजने में विफल रहा हूं। ध्यान दें कि .NET आपके अपेक्षा की तुलना में भी पागल हो सकता है - उदाहरण के लिए एक उदाहरण विधि को निष्पादित किया जा सकता है * जबकि सीएलआर जानता है कि कोई और आवृत्ति चर निर्दिष्ट नहीं किया जाएगा। –