2011-03-28 17 views
9

के बारे में यह जावा स्ट्रिंग कॉन्स्टेंट पूल के संबंध में है। मेरे कार्यक्रमों में से एक में मैं डेटाबेस के लिए पासवर्ड डिक्रिप्ट कर रहा हूं और इसे स्ट्रिंग में संग्रहीत कर रहा हूं। मैंने सुना है कि जावा स्ट्रिंग्स को कॉन्स्टेंट पूल में संग्रहीत किया जाएगा और वे वीएम रीस्टार्ट या क्लासलोडर को नष्ट नहीं करेंगे जो स्ट्रिंग क्विट लोड करते हैं।जावा स्ट्रिंग कॉन्स्टेंट पूल

यदि ऐसा है तो मेरे पासवर्ड स्ट्रिंग पूल में संग्रहीत किए जाएंगे। मैं इस मुद्दे के बारे में बहुत चिंतित हूं। क्या इन शाब्दिकों को नष्ट करने का कोई और तरीका है या मैं कुछ भी कर सकता हूं।

कृपया इस पर सुझाव देते हैं,

सादर, सनी।

उत्तर

6

यहां खेलने पर कई अलग-अलग मुद्दे हैं। सबसे पहले, "निरंतर पूल" शब्द स्ट्रिंग और संख्यात्मक अक्षरों के लिए कक्षा फ़ाइलों के एक बहुत ही विशिष्ट भाग को संदर्भित करता है, या जेवीएम में मौजूद वर्ग फ़ाइलों के इस भाग से उत्पन्न डेटा संरचनाओं को संदर्भित करता है। पासवर्ड तब तक संग्रहीत नहीं किया जाएगा जब तक कि वे कक्षा फ़ाइलों का हिस्सा न हों।

हालांकि, कुछ स्ट्रिंग ऑब्जेक्ट्स वास्तव में स्ट्रिंग इंटर्नमेंट के माध्यम से पूरे कार्यक्रम में संग्रहीत और साझा किए जाते हैं। कोई भी स्ट्रिंग अक्षर स्वचालित रूप से इंटर्न किया जाता है, जैसा कि आप किसी भी तार को इंटर्न() विधि का आह्वान करते हैं। मेरे सबसे अच्छे ज्ञान के लिए, हालांकि, इस तरह से कोई अन्य तार संग्रहीत नहीं किया जाता है, इसलिए जब तक आप अपने आप को पासवर्ड रखने वाले तारों को स्वचालित रूप से प्रशिक्षित नहीं करते हैं, मुझे नहीं लगता कि आपको इसके बारे में चिंता करने की आवश्यकता है।

एक और मुद्दा यह जानना है कि यदि आप स्मृति में रहने वाले पासवर्ड नहीं चाहते हैं, तो आपको स्ट्रिंग के बाद कचरा संग्रह के बारे में सावधान रहना पड़ सकता है जिसे अब संदर्भित नहीं किया जा सकता है। इसी प्रकार, यदि आप तारों के बीच साझा बैकिंग प्रस्तुतियों को प्रतिस्थापित करने वाले कुछ स्ट्रिंग विधियों का उपयोग करते हैं, तो आप इसे पूरा करने के बाद पूर्ण पासवर्ड स्ट्रिंग के आसपास रख सकते हैं।

यदि आप इस बारे में चिंतित हैं तो अन्य जावा कोड पुराने पासवर्ड देखने में सक्षम हैं जो अभी भी इंटर्न किए गए हैं या फिर भी स्मृति में रहते हैं, हालांकि, आपको चिंता करने की आवश्यकता नहीं है। इंटर्न वाले स्ट्रिंग पूल के तत्वों को फिर से चलाने या देखने का कोई तरीका नहीं है, या इसके बैकिंग सरणी को देखने के लिए स्ट्रिंग को खोलने का कोई तरीका नहीं है।

+1

कोड से उन तारों को ढूंढना आसान नहीं हो सकता है लेकिन वे एक हेपडम्प में होंगे।अगर मैं उन पर पहुंचने की कोशिश कर रहा था तो मैं एक हेपडम्प ट्रिगर करने की कोशिश करता हूं और डंप फ़ाइल को अलग करने की कोशिश करता हूं। – Ryan

3

यह केवल स्ट्रिंग अक्षर और स्ट्रिंग्स पर लागू होता है जिन्हें आपने intern() विधि कहा है। इसके बारे में सोचें: यदि यह सभी तारों पर लागू होता है तो आप जल्दी से स्मृति से बाहर हो जाएंगे। एक सर्वलेट अनुप्रयोग जो अलग-अलग (स्ट्रिंग) मानों के साथ अनुरोध पैरामीटर को संभालता है।

+0

जावा 1.8.20 ने एक पृष्ठभूमि स्ट्रिंग deduplication सुविधा पेश की जो आपके स्ट्रिंग्स इंटर्न() 'डी को इंटर्न() के बिना किसी भी व्यक्ति के समान है ( – Ryan

+0

तारों के बाद से, आप' intern() 'पर कॉल करते हैं, अभी भी सामान्य कचरा संग्रह के अधीन, सभी तारों का इलाज करने का कोई कारण नहीं है, जैसे कि 'इंटर्न() 'निर्माण के बाद लागू किया गया था, स्मृति आवश्यकताओं को बढ़ाया जाना चाहिए। दरअसल, ढेर में * कम * स्ट्रिंग उदाहरण होंगे। हालांकि, ऐसा करने से एक प्रदर्शन आपदा होगी ... – Holger

-1

दोस्त, पासवर्ड प्राप्त करने और अपने (संभवतः) स्ट्रिंग-प्रकार संचालन करने के लिए एक स्ट्रिंग बफर का उपयोग करें।

स्ट्रिंगबफर तार [] के रूप में तारों को स्टोर करता है, जो हटाया जा सकता है। या ओवरराइड या आप क्या है। StringBuffer.delete(0,StringBuffer.length());

या सिर्फ एक चार [] के रूप में डाटाबेस पासवर्ड प्राप्त और उस पर सीधे कार्य करते हैं - लेकिन मैं StringBuffer रास्ता (यह मानते हुए कि आप अपने सभी कोड स्ट्रिंग तरीकों का उपयोग कर दिया है) एक आसान छलांग हो जाएगा लगता है।

+0

एक char [] बहुत अच्छा है यदि आप इंटरफ़ेस को नियंत्रित करते हैं। यदि आपको एक ऐसी विधि को कॉल करना है जो स्ट्रिंग के रूप में पासवर्ड लेता है या बाद में एक स्ट्रिंग ऑब्जेक्ट बनाया जाएगा ... – Ryan

संबंधित मुद्दे