खाने के लिए मेरे पास एक जावा गेम सर्वर है जो 1 टीसीपी कनेक्शन प्रति थ्रेड का उपयोग करता है। (मुझे पता है कि यह बुरा है लेकिन मुझे इसे अभी इस तरह रखना होगा)। के बारे में 12 घंटे या उससे अधिक सर्वर के सक्रिय रहने की (और जुड़े 3.000 के बारे में खिलाड़ियों) के बादBufferedReader.read() 100% सीपीयू
public void run()
{
try
{
String packet = "";
char charCur[] = new char[1];
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
{
if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r')
{
packet += charCur[0];
}else if(!packet.isEmpty())
{
parsePlayerPacket(packet);
packet = "";
}
}
}catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{
kickPlayer();
}catch(Exception e){e.printStackTrace();};
Server.removeIp(_ip);
}
}
: एक (3.2GHz 6cor x2 मशीन, 24GB राम, विंडोज सर्वर 2003 64bits) और यहाँ पर कोड का एक टुकड़ा है जब तक मैं जावा एप्लिकेशन को मैन्युअल रूप से रीबूट नहीं करता, तब तक सर्वर सभी 12 CPUs का 100% हमेशा के लिए खाना शुरू करता है। तो खेल खराब बुराई शुरू होता है और मेरे खिलाड़ी शिकायत शुरू करते हैं।
इसलिए मैं अनुमान लगा रहा हूँ कि समस्या यहाँ से आ रहा है:
मैं आवेदन की रूपरेखा की कोशिश की और यहाँ है कि मैं क्या लेकर आए हैं
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
जानते हुए भी कि परिवर्तनीय "_in" सॉकेट इनपुट का एक पाठक है: (_in = नया BufferedReader (नया इनपुटस्ट्रीम रीडर (_socket.getInputStream()))।
पृथ्वी पर _in.read() लंबे सर्वर के बाद इतने सारे CPU क्यों लेते हैं?
मैंने थ्रेड.sleep (1) डालने का प्रयास किया है; और जबकि लूप के अंदर, लेकिन कुछ भी नहीं करता है, मुझे लगता है कि समस्या BufferedReader.read() विधि के अंदर है।
क्या किसी को यह पता है कि इसका क्या कारण हो सकता है ?? और इसे कैसे ठीक करें?
मुझे आश्चर्य है कि यह इस तथ्य के बजाय है कि आप एक लूप में स्ट्रिंग कॉन्सटेनेशन का उपयोग कर रहे हैं। और * क्यों * आप एक समय में केवल एक ही चरित्र पढ़ रहे हैं? –
पैकेट छोटे स्ट्रिंग्स हैं: "AB123"। तो इससे कोई फर्क नहीं पड़ता। – Reacen
जब तक आप किसी पर डीडीओएस हमला शुरू नहीं करते हैं, तब तक आप एक बड़ी स्ट्रिंग भेजते हैं। स्ट्रिंगबिल्डर का उपयोग करने के लिए एकाधिक वर्णों और * * को पढ़ने में इतना आसान है ... ऐसा क्यों नहीं करते? –