আমি একটি বিশাল ক্লাসপাথের সাথে অনেকগুলি এক্সএমএল প্রসেসিং করে একটি বড় জাভা ই অ্যাপ্লিকেশন পেয়েছি। বর্তমানে আমি আমার কয়েকটি ফাংশন দ্রুততর করার চেষ্টা করছি এবং স্যাম্পলিং প্রোফাইলারগুলির মাধ্যমে স্লো কোড পাথগুলি সনাক্ত করার চেষ্টা করছি।
একটি জিনিস আমি লক্ষ্য করেছি যে বিশেষত আমাদের কোডগুলির যে অংশগুলিতে আমরা কল করেছি TransformerFactory.newInstance(...)
সেগুলি মারাত্মকভাবে ধীর হয়। আমি এটি সর্বদা একটি নতুন উদাহরণ তৈরি করার FactoryFinder
পদ্ধতিতে ট্র্যাক করেছি । ইন javadoc আমি ক্যাশে সম্পর্কে নিম্নলিখিত নোট পাওয়া গেছে:findServiceProvider
ServiceLoader
ServiceLoader
সরবরাহকারীরা অলসভাবে অবস্থিত এবং তাত্ক্ষণিকভাবে, যা চাহিদা অনুযায়ী on একটি পরিষেবা লোডার এখনও অবধি লোড করা সরবরাহকারীদের একটি ক্যাশে বজায় রাখে। পুনরুক্তি পদ্ধতিটির প্রতিটি অনুরোধ একটি পুনরাবৃত্তিকে ফেরত দেয় যা প্রথমে ক্যাশের সমস্ত উপাদানগুলি তাত্ক্ষণিক ক্রমে প্রদান করে এবং তারপরে অলসভাবে যে কোনও অবশিষ্ট সরবরাহকারীকে সনাক্ত করে এবং তত্ক্ষণাত প্রতিটিকে ক্যাশে যুক্ত করে। পুনরায় লোড পদ্ধতির মাধ্যমে ক্যাশে সাফ করা যায়।
এ পর্যন্ত সব ঠিকই. এটি ওপেনজেডিকে FactoryFinder#findServiceProvider
পদ্ধতির একটি অংশ :
private static <T> T findServiceProvider(final Class<T> type)
throws TransformerFactoryConfigurationError
{
try {
return AccessController.doPrivileged(new PrivilegedAction<T>() {
public T run() {
final ServiceLoader<T> serviceLoader = ServiceLoader.load(type);
final Iterator<T> iterator = serviceLoader.iterator();
if (iterator.hasNext()) {
return iterator.next();
} else {
return null;
}
}
});
} catch(ServiceConfigurationError e) {
...
}
}
প্রতিটি কল findServiceProvider
কল ServiceLoader.load
। এটি প্রতিবার একটি নতুন সার্ভিস লোডার তৈরি করে । এইভাবে দেখে মনে হচ্ছে যে সার্ভিস লোডার ক্যাশে মেকানিজমের কোনও ব্যবহার নেই। প্রতিটি কল অনুরোধকৃত সার্ভিস প্রোভাইডারের জন্য ক্লাসপাথটি স্ক্যান করে।
আমি ইতিমধ্যে যা চেষ্টা করেছি:
- আমি জানি যে আপনি কোনও সিস্টেমের সম্পত্তি সেট করতে পারেন যেমন
javax.xml.transform.TransformerFactory
একটি নির্দিষ্ট বাস্তবায়ন নির্দিষ্ট করতে চান । এইভাবে ফ্যাক্টরিফাইন্ডার সার্ভিস লোডার প্রক্রিয়া এবং এর সুপার দ্রুত ব্যবহার করে না। দুঃখজনকভাবে এটি একটি jvm প্রশস্ত সম্পত্তি এবং আমার jvm এ চলমান অন্যান্য জাভা প্রক্রিয়াগুলিকে প্রভাবিত করে। উদাহরণস্বরূপ আমার অ্যাপ্লিকেশনটি স্যাকসনের সাথে পাঠানো হয় এবং ব্যবহার করা উচিতcom.saxonica.config.EnterpriseTransformerFactory
আমার কাছে আরও একটি অ্যাপ্লিকেশন রয়েছে যা স্যাকসনের সাথে জাহাজে আসে না। সিস্টেমের সম্পত্তি সেট করার সাথে সাথেই আমার অন্যান্য অ্যাপ্লিকেশন শুরু হতে ব্যর্থ হয়েছে, কারণcom.saxonica.config.EnterpriseTransformerFactory
এর ক্লাসপথে কোনও নেই । সুতরাং এটি আমার পক্ষে কোনও বিকল্প বলে মনে হয় না। - আমি
TransformerFactory.newInstance
যেখানেই ডেকে আছি তার প্রতিটি জায়গায় আমি ইতিমধ্যে রিফেক্টর করে ট্রান্সফর্মারফ্যাক্টরিটিকে ক্যাশে করেছি। তবে আমার নির্ভরতার বিভিন্ন জায়গা রয়েছে যেখানে আমি কোডটি রিফেক্টর করতে পারি না।
আমার প্রশ্নগুলি: ফ্যাক্টরিফাইন্ডার কেন একটি সার্ভিস লোডার পুনরায় ব্যবহার করে না? সিস্টেমের বৈশিষ্ট্যগুলি ব্যবহার না করে এই পুরো সার্ভিস লোডার প্রক্রিয়াটি আরও বাড়ানোর কোনও উপায় আছে কি? এটি কী জেডিকে পরিবর্তন করা যায় না যাতে কোনও ফ্যাক্টরিফাইন্ডার একটি সার্ভিস লোডার উদাহরণ পুনরায় ব্যবহার করে? এছাড়াও এটি একটি একক ফ্যাক্টরিফাইন্ডারের সাথে সুনির্দিষ্ট নয়। javax.xml
আমি এখনও অবধি প্যাকেজটিতে দেখেছি এই বাহাওয়ারটি সমস্ত ফ্যাক্টরিফাইন্ডার ক্লাসগুলির জন্য একই ।
আমি ওপেনডিজিডি 8/11 ব্যবহার করছি। আমার অ্যাপ্লিকেশনগুলি টমক্যাট 9 ইনস্ট্যান্সে মোতায়েন করা হয়েছে।
সম্পাদনা করুন: আরও বিশদ সরবরাহ করা
এখানে একটি একক এক্সএমএলআইনপুটফ্যাক্ট্রি.নিউআইন্সট্যান্স কলের জন্য কল স্ট্যাক রয়েছে:
যেখানে বেশিরভাগ সংস্থান ব্যবহৃত হয় ServiceLoaders$LazyIterator.hasNextService
। এই পদ্ধতিটি ফাইলটি getResources
পড়ার জন্য ClassLoader এ কল করে META-INF/services/javax.xml.stream.XMLInputFactory
। এই কলটি প্রতিটি সময় প্রায় 35 মিমি নেয়।
টমক্যাটকে এই ফাইলগুলি আরও দ্রুত সরবরাহ করা যাতে আরও ভালভাবে ক্যাশে দেওয়া যায় সেজন্য কোনও উপায় আছে?
-D
আপনার Tomcat
প্রক্রিয়াতে পতাকা ব্যবহার করে সম্পত্তি সেট করার চেষ্টা করেছেন ? উদাহরণস্বরূপ: -Djavax.xml.transform.TransformerFactory=<factory class>.
এটি অন্যান্য অ্যাপ্লিকেশনগুলির জন্য বৈশিষ্ট্যগুলি ওভাররাইড করা উচিত নয়। আপনার পোস্টটি ভাল বর্ণিত হয়েছে এবং সম্ভবত আপনি এটি ব্যবহার করে দেখেছেন তবে আমি নিশ্চিত করতে চাই। দেখুন Javax.xml.transform.TransformerFactory সিস্টেম সম্পত্তি কীভাবে সেট , কিভাবে HeapMemory বা জেভিএম আর্গুমেন্ট হুল বিড়াল মধ্যে সেট করতে