দুটি সহজ ক্লাস দিয়ে শুরু করা যাক:
package com.michaelt.so.supers;
public class Sup {
int methodA(int a, int b) {
return a + b;
}
}
এবং তারপর
package com.michaelt.so.supers;
public class Sub extends Sup {
@Override
int methodA(int a, int b) {
return super.methodA(a, b);
}
}
পদ্ধতিটি সংকলন করে এবং বাইট কোডটি দেখে একটি পায়:
methodA(II)I
L0
LINENUMBER 6 L0
ALOAD 0
ILOAD 1
ILOAD 2
INVOKESPECIAL com/michaelt/so/supers/Sup.methodA (II)I
IRETURN
L1
LOCALVARIABLE this Lcom/michaelt/so/supers/Sub; L0 L1 0
LOCALVARIABLE a I L0 L1 1
LOCALVARIABLE b I L0 L1 2
MAXSTACK = 3
MAXLOCALS = 3
এবং আপনি সেখানে সরাসরি আমন্ত্রণমূলক পদ্ধতি সহ দেখতে পাচ্ছেন এটি সুপার ক্লাস পদ্ধতিA () এর বিপরীতে রয়েছে।
Invokespecial opcode নিম্নলিখিত যুক্তিবিজ্ঞান আছে:
- যদি সিতে সমাধান নামক পদ্ধতির মতো একই নাম এবং বর্ণনাকারী সহ কোনও উদাহরণ পদ্ধতির জন্য কোনও ঘোষণা থাকে, তবে এই পদ্ধতিটি চালু করা হবে। দেখার পদ্ধতিটি সমাপ্ত হয়।
- অন্যথায়, যদি সি এর একটি সুপারক্লাস থাকে, তবে একই বর্ণন পদ্ধতিটি সি এর সরাসরি সুপারক্লাস ব্যবহার করে পুনরাবৃত্তভাবে সঞ্চালিত হয় oked
- অন্যথায়, একটি বিমূর্তমঠোডার উত্থাপিত হয়।
এই ক্ষেত্রে, তার ক্লাসে একই নাম এবং বর্ণনাকারীর কোনও উদাহরণ পদ্ধতি নেই তাই প্রথম বুলেটটি আগুন নেবে না। তবে দ্বিতীয় বুলেটটি এটি করবে - একটি সুপারক্লাস রয়েছে এবং এটি সুপারের পদ্ধতিটি আহ্বান করে।
সংকলকটি এটিকে ইনলাইন করে না এবং ক্লাসে সুপের উত্সের কোনও অনুলিপি নেই।
তবে গল্পটি এখনও শেষ হয়নি। এটি কেবল সংকলিত কোড। কোডটি JVM- এ আঘাত করলে হটস্পট জড়িত হতে পারে।
দুর্ভাগ্যক্রমে, আমি এ সম্পর্কে তেমন কিছুই জানি না, তাই আমি এই বিষয়ে কর্তৃত্বের কাছে আবেদন করব এবং জাভাতে ইনলাইনিংয়ে যাব যেখানে বলা হয় যে হটস্পট পদ্ধতিগুলি (এমনকি চূড়ান্ত নয় এমন চূড়ান্ত পদ্ধতি) ইনলাইন করতে পারে।
যাওয়া দস্তাবেজ কার্যকরভাবে Sup methodA থেকে কোড (কপি) উপ methodA মধ্যে () - এটি একটি বিশেষ পদ্ধতি কল পরিবর্তে করছেন যে প্রতিটি সময় অনুসন্ধান, এই তথ্য inlined করা যেতে পারে একটি গরম স্পট হয় তাহলে উল্লেখ করা হয়েছে।
অ্যাপ্লিকেশনটি কীভাবে আচরণ করছে এবং পারফরম্যান্সকে গতি বাড়ানোর জন্য কী কী অপ্টিমাইজেশন করা প্রয়োজন তার উপর ভিত্তি করে এটি রানটাইমে, মেমোরিতে করা হয়।
হটস্পট ইন্টারনালস যেমন ওপেনজেডিকে-তে বলা হয়েছে "পদ্ধতিগুলি প্রায়শই ইনলাইন করা হয় Stat স্ট্যাটিক, বেসরকারী, চূড়ান্ত এবং / অথবা" বিশেষ "অনুরোধগুলি ইনলাইন করা সহজ" "
আপনি যদি জেভিএমের বিকল্পগুলি খনন করেন তবে আপনি একটি বিকল্প পাবেন -XX:MaxInlineSize=35
(35 টি ডিফল্ট হবেন ) যা সর্বাধিক সংখ্যক বাইট যা অন্তর্নিহিত হতে পারে। আমি উল্লেখ করব যে এই কারণেই জাভা প্রচুর পরিমাণে ছোট্ট পদ্ধতি পছন্দ করতে পছন্দ করে - কারণ সেগুলি সহজেই ইনলাইন করা যায়। সেই ছোট পদ্ধতি হয়ে দ্রুত যখন তারা আরো কারণ তারা বলা হয় করতে inlined হবে না। এবং যখন কেউ এই সংখ্যাটি নিয়ে খেলতে পারে এবং এটি আরও বড় করে তুলতে পারে তখন এটি অন্যান্য অপ্টিমাইজেশানগুলি কম কার্যকর হতে পারে। (সম্পর্কিত এসও প্রশ্ন: হটস্পট জেআইটি ইনলাইনিং স্ট্র্যাটেজি যা হটস্পট করছে যে ইনলাইনিংয়ের অভ্যন্তরীণ স্থানে উঁকি দেওয়ার জন্য অন্যান্য বেশ কয়েকটি বিকল্প দেখায়)।
সুতরাং, না - সংকলনের সময় কোডটি অন্তর্ভুক্ত নয়। এবং হ্যাঁ - পারফরম্যান্স অপটিমাইজেশন এটির ওয়্যারেন্ট হলে কোডটি রানটাইমের সময় খুব ভালভাবে ইনলাইন করা যেতে পারে।
এবং হটস্পট ইনলাইনিং সম্পর্কে আমি যা লিখেছি তার সবই কেবল ওরাকল দ্বারা বিতরণ করা হটস্পট জেভিএম প্রযোজ্য। আপনি যদি জাভা ভার্চুয়াল মেশিনের উইকিপিডিয়াদের তালিকার দিকে লক্ষ্য করেন তবে হটস্পট ছাড়াও আরও অনেক কিছু রয়েছে এবং J জেভিএমগুলি যেভাবে ইনলাইনিং পরিচালনা করে তা আমি উপরে বর্ণিত চেয়ে সম্পূর্ণ আলাদা হতে পারে। অ্যাপাচি হারমনি, ডালভিক, এআরটি - জিনিসগুলি সেখানে আলাদাভাবে কাজ করতে পারে।