এটি ( openjdk version "1.8.0_222"
আমার বিশ্লেষণে ব্যবহৃত), 12.0.1
ওপেনজেডিকে (ওলেকসান্ডার পাইরোহভের মতে) এবং ওপেনজেডিকে 13 (কার্লোস হুবার্গারের মতে ) দিয়ে বিশ্বস্তভাবে পুনরুত্পাদন করা যেতে পারে (বা পুনরুত্পাদন করা নয়, আপনি যা চান তার উপর নির্ভর করে )।
আমি -XX:+PrintCompilation
উভয় আচরণ পেতে যথেষ্ট সময় নিয়ে কোডটি চালিয়েছি এবং এখানে পার্থক্য রয়েছে।
বগি বাস্তবায়ন (আউটপুট প্রদর্শন করে):
--- Previous lines are identical in both
54 17 3 java.lang.AbstractStringBuilder::<init> (12 bytes)
54 23 3 LoopOutPut::test (57 bytes)
54 18 3 java.lang.String::<init> (82 bytes)
55 21 3 java.lang.AbstractStringBuilder::append (62 bytes)
55 26 4 java.lang.AbstractStringBuilder::ensureCapacityInternal (27 bytes)
55 20 3 java.lang.StringBuilder::<init> (7 bytes)
56 19 3 java.lang.StringBuilder::toString (17 bytes)
56 25 3 java.lang.Integer::getChars (131 bytes)
56 22 3 java.lang.StringBuilder::append (8 bytes)
56 27 4 java.lang.String::equals (81 bytes)
56 10 3 java.lang.AbstractStringBuilder::ensureCapacityInternal (27 bytes) made not entrant
56 28 4 java.lang.AbstractStringBuilder::append (50 bytes)
56 29 4 java.lang.String::getChars (62 bytes)
56 24 3 java.lang.Integer::stringSize (21 bytes)
58 14 3 java.lang.String::getChars (62 bytes) made not entrant
58 33 4 LoopOutPut::test (57 bytes)
59 13 3 java.lang.AbstractStringBuilder::append (50 bytes) made not entrant
59 34 4 java.lang.Integer::getChars (131 bytes)
60 3 3 java.lang.String::equals (81 bytes) made not entrant
60 30 4 java.util.Arrays::copyOfRange (63 bytes)
61 25 3 java.lang.Integer::getChars (131 bytes) made not entrant
61 32 4 java.lang.String::<init> (82 bytes)
61 16 3 java.util.Arrays::copyOfRange (63 bytes) made not entrant
61 31 4 java.lang.AbstractStringBuilder::append (62 bytes)
61 23 3 LoopOutPut::test (57 bytes) made not entrant
61 33 4 LoopOutPut::test (57 bytes) made not entrant
62 35 3 LoopOutPut::test (57 bytes)
63 36 4 java.lang.StringBuilder::append (8 bytes)
63 18 3 java.lang.String::<init> (82 bytes) made not entrant
63 38 4 java.lang.StringBuilder::append (8 bytes)
64 21 3 java.lang.AbstractStringBuilder::append (62 bytes) made not entrant
সঠিক রান (কোনও প্রদর্শন নেই):
--- Previous lines identical in both
55 23 3 LoopOutPut::test (57 bytes)
55 17 3 java.lang.AbstractStringBuilder::<init> (12 bytes)
56 18 3 java.lang.String::<init> (82 bytes)
56 20 3 java.lang.StringBuilder::<init> (7 bytes)
56 21 3 java.lang.AbstractStringBuilder::append (62 bytes)
56 26 4 java.lang.AbstractStringBuilder::ensureCapacityInternal (27 bytes)
56 19 3 java.lang.StringBuilder::toString (17 bytes)
57 22 3 java.lang.StringBuilder::append (8 bytes)
57 24 3 java.lang.Integer::stringSize (21 bytes)
57 25 3 java.lang.Integer::getChars (131 bytes)
57 27 4 java.lang.String::equals (81 bytes)
57 28 4 java.lang.AbstractStringBuilder::append (50 bytes)
57 10 3 java.lang.AbstractStringBuilder::ensureCapacityInternal (27 bytes) made not entrant
57 29 4 java.util.Arrays::copyOfRange (63 bytes)
60 16 3 java.util.Arrays::copyOfRange (63 bytes) made not entrant
60 13 3 java.lang.AbstractStringBuilder::append (50 bytes) made not entrant
60 33 4 LoopOutPut::test (57 bytes)
60 34 4 java.lang.Integer::getChars (131 bytes)
61 3 3 java.lang.String::equals (81 bytes) made not entrant
61 32 4 java.lang.String::<init> (82 bytes)
62 25 3 java.lang.Integer::getChars (131 bytes) made not entrant
62 30 4 java.lang.AbstractStringBuilder::append (62 bytes)
63 18 3 java.lang.String::<init> (82 bytes) made not entrant
63 31 4 java.lang.String::getChars (62 bytes)
আমরা একটি উল্লেখযোগ্য পার্থক্য লক্ষ্য করতে পারি। সঠিক সম্পাদন সহ আমরা test()
দু'বার সংকলন করি । একবার শুরুর দিকে এবং তারপরে আবার (সম্ভবতঃ কারণটি পদ্ধতিটি কতটা গরম তা জেআইটি লক্ষ্য করে)। বগি এক্সিকিউশনটি 5 বার test()
সংকলন করা হয় (বা পচনশীল) ।
অতিরিক্ত হিসাবে, -XX:-TieredCompilation
(যা হয় ব্যাখ্যা করে, বা ব্যবহার করে C2
) বা-Xbatch
(যা সামঞ্জস্যের পরিবর্তে মূল থ্রেডে সংকলনকে চালিত করতে বাধ্য করে ) দিয়ে চলছে, আউটপুট গ্যারান্টিযুক্ত এবং 30000 পুনরাবৃত্তির সাহায্যে প্রচুর স্টাফ প্রিন্ট করে, তাই C2
সংকলকটি মনে হয় অপরাধী হতে। এটি চালিয়ে -XX:TieredStopAtLevel=1
যাচাই করা হয়েছে, যা অক্ষম করে C2
এবং আউটপুট উত্পাদন করে না (4 স্তরে থামিয়ে আবার বাগটি দেখায়)।
সঠিক প্রয়োগে, পদ্ধতিটি প্রথমে স্তর 3 সংকলন দিয়ে সংকলিত হয় , তারপরে স্তর 4 পরে।
বগি এক্সিকিউশনে, পূর্ববর্তী সংকলনগুলি পৃথক করা হয় ( made non entrant
) এবং এটি আবার স্তর 3 (যা C1
পূর্ববর্তী লিঙ্কটি দেখুন) তে সংকলিত হয়েছে ।
সুতরাং এটি অবশ্যই একটি ত্রুটিযুক্ত C2
, যদিও আমি এটি নিশ্চিত করতে পারি না যে এটি স্তর 3 সংকলনে ফিরে আসার বিষয়টি প্রভাবিত করে কিনা (এবং কেন এটি 3 স্তরে ফিরে যাচ্ছে, এতগুলি অনিশ্চয়তা এখনও আছে)।
আপনি নিম্নলিখিত লাইন দিয়ে সমাবেশ কোড খরগোশ গর্তে আরও গভীরে যেতে তৈরি করতে পারেন (এছাড়াও দেখুন এই সমাবেশ মুদ্রণ সক্ষম করতে)।
java -XX:+PrintCompilation -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly LoopOutPut > broken.asm
এই মুহুর্তে আমি দক্ষতার বাইরে চলে যেতে শুরু করছি, পূর্ববর্তী সংকলিত সংস্করণগুলি বাতিল হয়ে গেলে বগী আচরণটি প্রদর্শিত হতে শুরু করে, তবে 90 এর দশক থেকে আমার কাছে যে সামান্য সমাবেশ দক্ষতা রয়েছে তা তাই আমি আমার তুলনায় আরও চৌকস কাউকে নিতে দেব এখান থেকে.
সম্ভবত এটি সম্পর্কে ইতিমধ্যে একটি বাগ রিপোর্ট রয়েছে, যেহেতু কোডটি অন্য কেউ ওপিকে উপস্থাপন করেছে এবং সমস্ত কোড সি 2 বাগ ছাড়াই নেই । আমি আশা করি এই বিশ্লেষণটি আমার কাছে যেমনটি ছিল তেমনি অন্যদের কাছে তথ্যবহুল ছিল।
শ্রদ্ধেয় অপাঙ্গিন মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, এটি সাম্প্রতিক বাগ । আগ্রহী এবং সহায়ক সমস্ত লোকের প্রতি অনেক বাধ্য :)