কেন sun.misc.Unsafe বিদ্যমান, এবং কীভাবে এটি বাস্তব বিশ্বে ব্যবহার করা যেতে পারে? [বন্ধ]


267

আমি অন্য দিন সূর্য.মিস্ক.উনস্যাফ প্যাকেজটি পেরিয়ে এসেছি এবং এটি কী করতে পারে তা দেখে অবাক হয়েছিল।

অবশ্যই, ক্লাসটি অননুমোদিত, তবে আমি ভাবছিলাম যে এটির ব্যবহারের কোনও ভাল কারণ আছে কিনা। আপনার যেখানে এটি ব্যবহার করা দরকার সেখানে কোন পরিস্থিতিতে দেখা দিতে পারে? এটি কীভাবে বাস্তব-বিশ্বের দৃশ্যে ব্যবহৃত হতে পারে?

তদ্ব্যতীত, আপনার যদি এটির প্রয়োজন হয়, এটি কি এটি নির্দেশ করে না যে আপনার নকশার সাথে সম্ভবত কিছু ভুল রয়েছে?

কেন জাভা এমনকি এই বর্গ অন্তর্ভুক্ত করে?


7
জেডিকে ডিভসরা বর্তমানে জাভা ৯-এ পাবলিক এপিআইতে রূপান্তরিত করার জন্য এই এপিআইটি পর্যালোচনা করছে you আপনি যদি এটি ব্যবহার করেন তবে সমীক্ষাটি পূরণ করতে 5 মিনিট সময় লাগবে: জরিপমোনকি . com / s / sun-misc-Unafe
অ্যান্ডি লিঞ্চ

2
এই পোস্টটি মেটা নিয়ে আলোচনা হচ্ছে: মেটা.স্ট্যাকওভারফ্লো.com
জন

উত্তর:


159

উদাহরণ

  1. ভিএম "অন্তর্ভুক্তি"। যেমন লক-ফ্রি হ্যাশ টেবিলগুলিতে ব্যবহৃত সিএএস (তুলনা করুন এবং অদলবদল) যেমন: সান.মিস্ক.উনস্যাফ ডট কম

    এখানে সিএএস সম্পর্কে আরও পড়ুন http://en.wikedia.org/wiki/Compare-and-wap

  2. হোস্ট ভিএম এর সূর্য.মিস্ক.উনসেফ কার্যকারিতা অবিচ্ছিন্ন বস্তুগুলিকে বরাদ্দ করতে এবং তারপরে অন্য কোনও পদ্ধতি কল হিসাবে কনস্ট্রাক্টর অনুরোধকে ব্যাখ্যা করতে পারে।

  3. কেউ স্থানীয় ঠিকানা থেকে ডেটা ট্র্যাক করতে পারে j java.lang.Unsafe ক্লাস ব্যবহার করে কোনও অবজেক্টের মেমরি ঠিকানা পুনরুদ্ধার করা সম্ভব এবং সরাসরি অনিরাপদ প্রাপ্ত / রাখার পদ্ধতিগুলির মাধ্যমে তার ক্ষেত্রগুলিতে পরিচালনা করা সম্ভব!

  4. জেভিএমের জন্য সময় অপ্টিমাইজেশানগুলি সঙ্কলন করুন। উচ্চ-স্তরের ক্রিয়াকলাপের জন্য "ম্যাজিক" ব্যবহার করে এইচআইজি পারফরম্যান্স ভিএম। যেমন: http://en.wikedia.org/wiki/Jikes_RVM

  5. মেমরি বরাদ্দ, সান.মিসিক.উনস্যাফ.এলোকটেমোরি উদাহরণ: - ডাইরেক্টবাইটবার্ফার কনস্ট্রাক্টর অভ্যন্তরীণভাবে এটি কল করে যখন বাইটবফার.লোকটড্রাইট ডায়রেক্ট করা হয়

  6. কল স্ট্যাকটি সন্ধান করা এবং সূর্য.মিস্ক দ্বারা ইনস্ট্যান্ট করা মানগুলির সাথে পুনরায় খেলনা।

  7. sun.misc.Unsafe.arrayBaseOffset এবং arrayIndexScale এ অ্যারেলেটগুলি বিকাশের জন্য ব্যবহার করা যেতে পারে, বৃহত্তর অবজেক্টগুলিতে স্ক্যান, আপডেট বা অপারেটিংয়ের রিয়েল-টাইম ব্যয়কে সীমাবদ্ধ করতে দক্ষতার সাথে ছোট ছোট অবজায় দক্ষতার সাথে ব্রেক করার জন্য একটি কৌশল technique

  8. http://robaustin.wikidot.com/how-to-write-to-direct-memory-locations-in-java

এখানে রেফারেন্সে আরও - http://bytescrolls.blogspot.com/2011/04/interesting-uses-of-sunmiscunsafe.html


1
যদি আপনি অনিরাপদ ব্যবহার করে কোনও ক্ষেত্রের ঠিকানা পেয়ে থাকেন তবে এটি সর্বদা জিসি দ্বারা পরিবর্তন করা যেতে পারে, সুতরাং সেই অপারেশনটি বেশ বেহুদা?
pdeva

আপনার বরাদ্দকৃতদের জন্য ঠিকানাটি পান
zudokod

আমি যে বরাদ্দ করেছি তার দ্বারা আপনি ঠিক কী বোঝাতে চাইছেন । এটি এমন জায়গায় ব্যবহার করা হবে বলে মনে হয় যেখানে 'নতুন' অপারেটর ব্যবহার করে অবজেক্ট তৈরি করা হয়েছিল, সুতরাং আমার প্রশ্ন।
pdeva

1
অনিরাপদ.এলোকোটমেমরি এবং মানটি রাখুন
zudokod

1
পয়েন্ট 2 সম্পর্কিত, আমি জানতে চাই আপনি কীভাবে অন্য কোনও পদ্ধতির কল হিসাবে কনস্ট্রাক্টরকে ডাকতে পারেন? কারণ বাইকোডে না থাকলে আমি এটি করার কোনও উপায় পাইনি।
মিগুয়েল গ্যাম্বোয়া

31

কিছু কোড অনুসন্ধান ইঞ্জিনে অনুসন্ধান চালানো থেকে আমি নিম্নলিখিত উদাহরণগুলি পেয়েছি:

Class @ লিঙ্ক অনিরাপদ} অবজেক্টে অ্যাক্সেস পাওয়ার জন্য সহজ বর্গ। অ্যারেগুলিতে দক্ষ সিএএস অপারেশনের জন্য l @ লিঙ্ক অনিরাপদ fe * প্রয়োজন is নোট করুন যে {@ লিঙ্ক java.util.concurrent.atomic in যেমন {@ লিঙ্ক java.util.concurrent.atomic.AtomicLongArray as এর সংস্করণগুলিতে অতিরিক্ত মেমরি অর্ডারিং গ্যারান্টি প্রয়োজন যা সাধারণত এই অ্যালগরিদমে প্রয়োজন হয় না এবং এটি ব্যয়বহুলও হয় বেশিরভাগ প্রসেসরের উপর।

  • SoyLatte - জাভা 6 অপটিক জাভাদোক অংশের জন্য

/ ** সূর্য.মিস্কের জন্য বেস ক্লাস U স্ট্যাটিক ক্ষেত্রগুলির জন্য ইউসএফ-ভিত্তিক ফিল্ডএ্যাকসেসর। পর্যবেক্ষণটি হ'ল প্রতিবিম্ব কোডের দৃষ্টিকোণ থেকে কেবল নয় ধরণের ক্ষেত্র রয়েছে: আটটি আদিম ধরণের এবং অবজেক্ট। জেনারেটেড বাইটকোডগুলির পরিবর্তে অরক্ষিত শ্রেণি ব্যবহার করা গতিশীলভাবে উত্পন্ন ফিল্ডঅ্যাকসেসরগুলির জন্য মেমরি এবং লোডিংয়ের সময় সাশ্রয় করে। * /

  • SpikeSource

/ * ফাইনালফিল্ডগুলি যেগুলি তারে জুড়ে প্রেরণ করা হয় .. কীভাবে গ্রহণযোগ্যতার দিক থেকে বস্তুটি আনমশাল করে পুনরায় তৈরি করা যায়? আমরা কনস্ট্রাক্টরকে অনুরোধ করতে চাই না কারণ এটি চূড়ান্ত ক্ষেত্রগুলির জন্য মান প্রতিষ্ঠা করবে। চূড়ান্ত ক্ষেত্রটি ঠিক প্রেরকের দিকে যেমন ছিল তেমনই আমাদের পুনরায় তৈরি করতে হবে। সূর্য.মিস্ক.উনসেফ এটি আমাদের জন্য করে। * /

আরও অনেক উদাহরণ রয়েছে, কেবল উপরের লিঙ্কটি অনুসরণ করুন ...


25

মজার বিষয়, আমি এই ক্লাসটি সম্পর্কে কখনও শুনিনি (যা সম্ভবত একটি ভাল জিনিস, সত্যই)।

মনে রাখা যায় এমন একটি জিনিস হ'ল অনিরাপদ # সেটমেমিটি ব্যবহার করে এক পর্যায়ে সংবেদনশীল তথ্য থাকা বাফারগুলিকে শূন্য করতে (পাসওয়ার্ড, কী, ...)। এমনকি আপনি "অপরিবর্তনীয়" অবজেক্টগুলির ক্ষেত্রেও এটি করতে পারেন (তারপরে আবার আমি অনুমান করি যে এখানে পুরানো প্রতিবিম্বটি সম্ভবত কৌশলটি করতে পারে)। আমি কোনও সুরক্ষার বিশেষজ্ঞ নই যদিও লবণের দানা দিয়ে এটি নিন।


4
I'd never even heard of this class... আমি আপনাকে এ সম্পর্কে অনেকবার বলেছি! দীর্ঘশ্বাস + :(
টিম বেন্ডার

7
কোনও বক্তব্য হবে না, যেহেতু জাভা একটি অনুলিপি জেনারেল আবর্জনা সংগ্রহকারী ব্যবহার করে এবং আপনার সংবেদনশীল তথ্য সম্ভবত ইতিমধ্যে অন্য কোনও জায়গায় 'ফ্রি' মেমরির ওভাররাইট করার জন্য অপেক্ষা করে অবস্থিত।
ড্যানিয়েল ক্যাসিডি

39
এটি সম্পর্কে কখনও শুনিনি, তবে আমি তাদের park()ডকুমেন্টেশনটি পছন্দ করি: "ভারসাম্য আনপার্ক দেখা দেওয়ার সময় ফিরে আসা বা ফিরে আসার ভারসাম্যটি আনলক করা হয়েছে বা থ্রেডটি বাধাগ্রস্থ হয়েছে, বা যদি নিরঙ্কুশ নয় এবং সময় শূন্য নয়, প্রদত্ত সময় ন্যানোসেকেন্ডগুলি অতিক্রান্ত হয়েছে, বা যদি নিখুঁত হয় তবে ইপোকের পর থেকে মিলসেকেন্ডে প্রদত্ত সময়সীমা বা তীব্রভাবে (যেমন, কোনও কারণ ছাড়াই প্রত্যাবর্তন করা হয়েছে) "। প্রোগ্রামটি প্রস্থান করলে, বা, এলোমেলো বিরতিতে, যে কোনওটি প্রথমে আসে "মেমরিটি প্রায় মুক্ত হয় as
আরথ

1
@ ড্যানিয়েল, আকর্ষণীয়, আমি এটি বিবেচনা করি নি। এখন আপনি দেখতে পাচ্ছেন যে আমি কেন নিরাপত্তা বিশেষজ্ঞ নই। :)
মাইক ড্যানিয়েল

22

জাভা 1.6.12 গ্রন্থাগারের রেফারেন্স ট্রেসিংয়ের জন্য গ্রীক ব্যবহার করে একটি সংক্ষিপ্ত বিশ্লেষণের ভিত্তিতে, মনে হয় যেন এর প্রতিটি কার্যকর কার্যকারিতা Unsafeকার্যকর উপায়ে প্রকাশিত হয়।

সিএএস অপারেশনগুলি পরমাণু * ক্লাসের মাধ্যমে প্রকাশিত হয়। ডাইরেক্টবাইটবাফার সিঙ্ক নির্দেশাবলী (পার্ক, আনপার্ক) এর মাধ্যমে মেমোরি ম্যানিপুলেশন ফাংশনগুলি উন্মোচিত হয় অ্যাবস্ট্রাক্ট কিউইউডসিনক্রোনাইজারের মাধ্যমে যা পরিবর্তিতভাবে লক বাস্তবায়ন দ্বারা ব্যবহৃত হয়।


অ্যাটমিকএক্সএক্সএক্সএইচপিডিটারগুলি খুব ধীর এবং যখন আপনার সত্যই এগুলির দরকার হয়: সিএএস - আপনি এগুলিকে বাস্তবে ব্যবহারের সামর্থ্য রাখতে পারবেন না। আপনি যদি ধাতুটি করতে যাচ্ছেন তবে আপনি বিমূর্ত স্তর এবং অসংখ্য চেক ব্যবহার করবেন না। সিএএস ব্যর্থ হওয়া লুপ ইএসপিতে খারাপ। যখন হার্ডওয়্যারটি শাখার ভুল অনুমান করার সিদ্ধান্ত নেয় (উচ্চ বিতর্কিত কারণে) তবে আরও কয়েকটি তুলনা / শাখা থাকা কেবল ব্যথা করে। পার্ক / আনপার্ক একিউএসের মাধ্যমে প্রকাশ করা LockSupportহয়নি (যা পার্ক / আনপার্কের চেয়ে লক
ইমপ্লিমেন্টের

21

অনিরাপদ.থ্রো এক্সেপশন - চেক করা ব্যতিক্রমগুলি তাদের ঘোষণা না করেই ফেলে দিতে দেয়।

এটি এমন কিছু ক্ষেত্রে কার্যকর যেখানে আপনি প্রতিফলন বা এওপি মোকাবেলা করেন।

ধরে নিন আপনি কোনও ব্যবহারকারী সংজ্ঞাযুক্ত ইন্টারফেসের জন্য জেনেরিক প্রক্সি তৈরি করেন। এবং ব্যবহারকারী নির্দিষ্ট ইন্টারফেসে ব্যতিক্রমটি ঘোষণা করে কোনও বিশেষ ক্ষেত্রে প্রবেশন দ্বারা কোন ব্যতিক্রম ছুঁড়ে তা নির্দিষ্ট করতে পারে। তারপরে ইন্টারফেসের ডায়নামিক বাস্তবায়নে একটি চেক করা ব্যতিক্রম বাড়াতে আমি জানি এটিই একমাত্র উপায়।

import org.junit.Test;
/** need to allow forbidden references! */ import sun.misc.Unsafe;

/**
 * Demonstrate how to throw an undeclared checked exception.
 * This is a hack, because it uses the forbidden Class {@link sun.misc.Unsafe}.
 */
public class ExceptionTest {

    /**
     * A checked exception.
     */
    public static class MyException extends Exception {
        private static final long serialVersionUID = 5960664994726581924L;
    }

    /**
     * Throw the Exception.
     */
    @SuppressWarnings("restriction")
    public static void throwUndeclared() {
        getUnsafe().throwException(new MyException());
    }

    /**
     * Return an instance of {@link sun.misc.Unsafe}.
     * @return THE instance
     */
    @SuppressWarnings("restriction")
    private static Unsafe getUnsafe() {
        try {

            Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
            singleoneInstanceField.setAccessible(true);
            return (Unsafe) singleoneInstanceField.get(null);

        } catch (IllegalArgumentException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (SecurityException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (NoSuchFieldException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (IllegalAccessException e) {
            throw createExceptionForObtainingUnsafe(e);
        }
    }

    private static RuntimeException createExceptionForObtainingUnsafe(final Throwable cause) {
        return new RuntimeException("error while obtaining sun.misc.Unsafe", cause);
    }


    /**
     * scenario: test that an CheckedException {@link MyException} can be thrown
     * from an method that not declare it.
     */
    @Test(expected = MyException.class)
    public void testUnsingUnsaveToThrowCheckedException() {
        throwUndeclared();
    }
}

14
আপনি একই ডাব্লু / Thread.stop(Throwable)অনিরাপদ প্রয়োজন নেই, একই থ্রেডে আপনি যে কোনও
উপায়ে

আপনি খাঁটিভাবে বাইটকোডের মাধ্যমে এটি করতে পারেন (বা এটি করার জন্য লম্বোক ব্যবহার করুন)
অ্যান্টিমনি

1
@ বেস্টেস এই পদ্ধতিটি UnsupportedOperationExceptionজাভা ৮-এর মতো বর্তমান থ্রেডে আটকানো হয়েছে এবং ছুড়ে ফেলেছে তবে, নো-আর্গুমেন্ট সংস্করণটি ThreadDeathএখনও কাজ করে।
gparyani

@ ডিড্রিবিফনেটসি, আমি বেশ কিছুদিন ধরে মূল জেডিকে আলোচনা অনুসরণ করি নি এবং জাভা ৮ এ যাওয়ার কোনও পরিকল্পনা নেই, তবুও, এটি বেশ বিস্ময়কর ধারণা, যেহেতু এটি বাইকোড জেনারেশন দ্বারা যাইহোক বাস্তবায়িত করা তুচ্ছ, যদি না এখন যাচাইকারী সত্যতা যাচাই করেন তারা পদ্ধতিটি থ্রোয়েবলগুলি ঘোষণা করে ... তবে এটি পিছনে অসম্পূর্ণ হতে পারে কারণ নিক্ষিপ্ত ব্যতিক্রম সম্পর্কে মেটাডেটা বাতিল হতে পারে।
বেসট্যাসে

10

ক্লাস অনিরাপদ

নিম্ন-স্তরের, অনিরাপদ ক্রিয়াকলাপ সম্পাদনের জন্য পদ্ধতির সংগ্রহ। যদিও ক্লাস এবং সমস্ত পদ্ধতিগুলি সর্বজনীন, এই শ্রেণীর ব্যবহার সীমাবদ্ধ কারণ কেবলমাত্র বিশ্বস্ত কোডই এর উদাহরণ পেতে পারে।

এর একটি ব্যবহার java.util.concurrent.atomicক্লাসে রয়েছে:


6

দক্ষ মেমরি কপির জন্য (কমপক্ষে শর্ট ব্লকগুলির জন্য System.arraycopy () এর চেয়ে অনুলিপি করা দ্রুত); যেমন জাভা দ্বারা ব্যবহৃত LZF এবং স্ন্যাপি কোডেক। তারা 'গেটলং' এবং 'পুটলং' ব্যবহার করে, যা কপি বাই-বাই বাইট করার চেয়ে দ্রুত; 16/32/64 বাইট ব্লকগুলির মতো জিনিসগুলি অনুলিপি করার সময় বিশেষত দক্ষ।


1
দোহ, অ্যারেকপি x86-64 এ এসএসই লুপগুলি ব্যবহার করে যা এর চেয়ে ভাল getLong/putLong(এবং আপনাকে ঠিকানাটিও গণনা করতে হবে)
5'14

আপনি কি আসলে এটি পরিমাপ করেছেন? সংক্ষিপ্ত ব্লকগুলির জন্য আমি getLong/ putLong: এর সংমিশ্রণটি ব্যবহার করার সময় x86-64 এ ধারাবাহিকভাবে আরও ভাল পারফরম্যান্স দেখতে পাচ্ছি আদর্শভাবে আমি System.arraycopy()সরলতা এবং সকলের পক্ষে পছন্দ করব ; তবে প্রকৃত পরীক্ষার ক্ষেত্রে আমি পরীক্ষা করেছি এমন ক্ষেত্রে অন্যথায় প্রদর্শিত হয়েছিল।
স্ট্যাকসম্যান

হ্যাঁ অনিরাপদ ব্যবহার করে আমি ডিফল্ট ইমপ্লের বাইরে কোনও অর্থবহ পারফরম্যান্স করতে পারিনি। সংকলকটির দৈর্ঘ্য পরীক্ষা করতে হবে যখন বড় অ্যারেগুলিতে বেশিরভাগ বাইটের দীর্ঘ কপির জন্য / পুটলং পেতে পারে। কিছু প্ররোচিত। মেমরি বেড়া অতীতে যোগ করুন System.arrayCopy (যদিও অক্ষম / সক্ষম করা যেতে পারে), যাতে এটি আসল অপরাধী হতে পারে।
বেটসেস

ঠিক আছে. এটা সম্ভব যে নতুন জেডিকে এটি পরিবর্তন করেছে; মূলত যখন আমি দ্রুত অপারেশনটি পর্যবেক্ষণ করি (জেডিকে ১.। সহ) আমিও অবাক হয়েছিলাম। অথবা সম্ভবত আমি ব্যবহারের কিছু নির্দিষ্ট পার্থক্য ভুলে যাচ্ছি। এগুলি কৌশলপূর্ণ (এবং সম্ভবত অস্থির) অপটিমাইজেশন রয়েছে, এমনকি তারা কাজ করার পরেও, এবং প্রভাবগুলি পরিমাপ করার জন্য এটি প্রয়োজনীয়।
স্ট্যাকসমান

5

আমি সম্প্রতি জেভিএম পুনর্নির্মাণের জন্য কাজ করছিলাম এবং দেখলাম যে অবাক করা সংখ্যক শ্রেণি শর্তাবলীতে প্রয়োগ করা হয়েছে Unsafe। ক্লাসটি বেশিরভাগ জাভা লাইব্রেরি প্রয়োগকারীদের জন্য ডিজাইন করা হয়েছে এবং এতে এমন বৈশিষ্ট্য রয়েছে যা মূলত অনিরাপদ তবে দ্রুত আদিম নির্মাণের জন্য প্রয়োজনীয়। উদাহরণস্বরূপ, কাঁচা মাঠের অফসেটগুলি পাওয়ার ও হার্ডওয়্যার-স্তরের সিঙ্ক্রোনাইজেশন ব্যবহার, মেমরি বরাদ্দকরণ ও মুক্তকরণ ইত্যাদি পদ্ধতি রয়েছে যা সাধারণ জাভা প্রোগ্রামাররা ব্যবহার করার উদ্দেশ্যে নয়; এটি অদ্বিতীয়, বাস্তবায়ন-নির্দিষ্ট এবং অন্তর্নিহিত অনিরাপদ (অতএব নাম!)। তদুপরি, আমি মনে করি যে SecurityManagerপ্রায় সব ক্ষেত্রেই এটি অ্যাক্সেসটিকে অস্বীকার করবে।

সংক্ষেপে, এটি মূলত গ্রন্থাগার প্রয়োগকারীদের দেশী মতো নির্দিষ্ট ক্লাসে প্রতিটি পদ্ধতি ঘোষণা না করে অন্তর্নিহিত মেশিনে অ্যাক্সেসের অনুমতি দেওয়ার জন্য বিদ্যমান AtomicInteger। আপনার রুটিন জাভা প্রোগ্রামিংয়ে এটি ব্যবহার বা উদ্বেগের দরকার নেই, কারণ পুরো পয়েন্টটি হ'ল বাকী লাইব্রেরিগুলিকে এত তাড়াতাড়ি করে তুলতে হবে যে আপনার সেই ধরণের অ্যাক্সেসের প্রয়োজন হবে না।


প্রকৃতপক্ষে, প্রতিচ্ছবি অক্ষম করা থাকলে সিকিউরিটি ম্যানেজার এতে অ্যাক্সেসের অনুমতি দেয় না
আমারা

@ স্পার্কলেস্যা- আপনি কি এ বিষয়ে বিস্তারিত বলতে পারবেন?
টেম্পলেটটিফাইফ

getUnsafe থেকে উদাহরণ পাওয়ার Unsafe.class.getDeclaredField("theUnsafe")সাথে সাথে বরং আরও কঠোর প্রয়োজনীয়তা রয়েছে .setAccessible(true)এবং এর পরে .get(null)এটিও পাবেন
আমারা

@ স্পার্কলেশি - আমি অবাক হয়ে কাজ করি - সুরক্ষা পরিচালককে এটি পতাকাঙ্কিত করা উচিত।
টেম্পলেটটিফাইফ

5

অ্যাক্সেস করতে এবং দক্ষতার সাথে বিপুল পরিমাণে মেমরির বরাদ্দ করতে এটি ব্যবহার করুন যেমন আপনার নিজস্ব ভক্সেল ইঞ্জিনে! (অর্থাত্ মাইনক্রাফ্ট-শৈলীর খেলা))

আমার অভিজ্ঞতায়, জেভিএম আপনার সত্যিকারের প্রয়োজনের স্থানে প্রায়শই সীমানা-চেকিং অপসারণ করতে অক্ষম থাকে। উদাহরণস্বরূপ, যদি আপনি একটি বড় অ্যারে দিয়ে পুনরাবৃত্তি করেন তবে লুপটিতে একটি অ-ভার্চুয়াল * পদ্ধতি কলের নীচে প্রকৃত মেমরি অ্যাক্সেসটি টাক করা হয়, জেভিএম এখনও একবার আগে না হয়ে প্রতিটি অ্যারে অ্যাক্সেসের সাথে বাউন্ড চেক করতে পারে still লুপ সুতরাং, সম্ভাব্য আকারে বড় পারফরম্যান্স লাভের জন্য, আপনি কোনও পদ্ধতি ব্যবহার করে লুপের অভ্যন্তরে জেভিএমের সীমানা-চেকিংকে সরিয়ে ফেলতে পারেন যা সূর্য.মিস্ক ব্যবহার করে Uঅন্যাসেফটি সরাসরি স্মৃতিতে অ্যাক্সেস করতে সক্ষম হন, সঠিক জায়গাগুলিতে নিজেকে কোনও সীমানা-পরীক্ষা করা নিশ্চিত করে নিন। (আপনি কিছু স্তরে চেক করতে চলেছেন, তাই না?)
* অ-ভার্চুয়াল দ্বারা, আমি বলতে চাইছি যে জেভিএমকে আপনার বিশেষ পদ্ধতিটি যাই হোক না কেন গতিশীলভাবে সমাধান করতে হবে না, কারণ আপনি সঠিকভাবে গ্যারান্টি দিয়ে গেছেন যে শ্রেণি / পদ্ধতি / উদাহরণটি স্থির / চূড়ান্ত / কী-আপনার-এর সংমিশ্রণ।

আমার বাড়ির বিকাশযুক্ত ভোক্সেল ইঞ্জিনের জন্য, এর ফলে খণ্ড জেনারেশন এবং সিরিয়ালাইজেশন চলাকালীন নাটকীয় পারফরম্যান্স লাভ করেছে (আমি যে জায়গাগুলিতে আমি একবারে পুরো অ্যারেতে পড়ছিলাম / লিখছিলাম)। ফলাফলগুলি পৃথক হতে পারে, তবে যদি সীমা-নির্মূলের অভাব আপনার সমস্যা হয় তবে এটি এটিকে ঠিক করে দেবে।

এটির সাথে কয়েকটি সম্ভাব্য বড় সমস্যা রয়েছে: বিশেষত, আপনি যখন আপনার ইন্টারফেসের ক্লায়েন্টদের সীমাবদ্ধতা পরীক্ষা না করে মেমরি অ্যাক্সেস করার ক্ষমতা সরবরাহ করেন, তারা সম্ভবত এটির অপব্যবহার করবে। (ভুলে যাবেন না যে হ্যাকাররাও আপনার ইন্টারফেসের ক্লায়েন্ট হতে পারে ... বিশেষত জাভাতে লেখা ভোক্সেল ইঞ্জিনের ক্ষেত্রে)) সুতরাং, আপনার হয় নিজের ইন্টারফেসটি এমনভাবে ডিজাইন করা উচিত যাতে স্মৃতি অ্যাক্সেসের অপব্যবহার করা যায় না, বা আপনি আগে এটি আগের পারেন ব্যবহারকারী-ডেটা যাচাই করতে অত্যন্ত সতর্কতা অবলম্বন করা উচিত কি কখনো আপনার বিপজ্জনক ইন্টারফেসের সাথে মিশ্রিত। হ্যাকার যাচাই না করা স্মৃতি অ্যাক্সেসের মাধ্যমে হ্যাকার যে বিপর্যয়কর জিনিসগুলি করতে পারে তা বিবেচনা করে উভয় পন্থা গ্রহণ করা ভাল।


4

অফ-হিপ সংগ্রহগুলি বিপুল পরিমাণ মেমরি বরাদ্দ করতে এবং জিসি হস্তক্ষেপ ছাড়াই ব্যবহারের সাথে সাথে এটি হ্রাস করতে কার্যকর হতে পারে। অফ-হিপ অ্যারে / লিস্টের উপর ভিত্তি করে কাজ করার জন্য আমি একটি গ্রন্থাগার লিখেছিলাম sun.misc.Unsafe


4

আমরা অরক্ষিত ব্যবহার করে অ্যারে, হ্যাশম্যাপস, ট্রি ম্যাপের মতো বিশাল সংগ্রহ বাস্তবায়ন করেছি।
এবং খণ্ড খণ্ডগুলি এড়াতে / কমাতে, আমরা dlmalloc এর ধারণাটি অনিরাপদ ব্যবহার করে মেমরি বরাদ্দককে প্রয়োগ করেছি।
এটি আমাদের একযোগে পারফরম্যান্স পেতে সহায়তা করেছে।


3

Unsafe.park()এবং Unsafe.unpark()কাস্টম সম্মতি নিয়ন্ত্রণ কাঠামো এবং সমবায় সময়সূচী প্রক্রিয়া নির্মাণের জন্য।


24
হিসাবে সর্বজনীনভাবে উপলভ্যjava.util.concurrent.locks.LockSupport
21

1

এটি নিজেই ব্যবহার করেননি, তবে আমি মনে করি আপনি যদি এমন একটি চলক থাকে যা মাঝে মাঝে মাঝে একাধিক থ্রেড দ্বারা পড়ে থাকে (যাতে আপনি এটি সত্যই অস্থির করতে চান না) আপনি putObjectVolatileমূল থ্রেডে লেখার সময় এটি ব্যবহার করতে পারেন এবং readObjectVolatileঅন্যান্য থ্রেড থেকে বিরল পড়ার সময়।


1
কিন্তু নিচের থ্রেডে আলোচনা অনুযায়ী, uncontented উদ্বায়ী প্রায় হিসাবে দ্রুত অ volatiles যাহাই হউক না কেন হল stackoverflow.com/questions/5573782/...
pdeva

আপনি সরল লেখাগুলি এবং অস্থির পাঠকদের সাথে অস্থির শব্দার্থ প্রতিস্থাপন করতে পারবেন না ... এটি বিপর্যয়ের একটি রেসিপি কারণ এটি এক সেটিংসে কাজ করতে পারে তবে অন্যটি নয়। আপনি যদি কোনও একক লেখকের থ্রেডের সাথে অস্থির শব্দার্থবিজ্ঞানের সন্ধান করতে চান তবে আপনি লেখার থ্রেডে অ্যাটমিক রেফারেন্স.লাজিসেটটি ব্যবহার করতে পারেন এবং পাঠকদের উপর () পোস্টটি পেতে পারেন (বিষয়টিতে আলোচনার জন্য এই পোস্টটি দেখুন )। অস্থির পাঠাগুলি তুলনামূলকভাবে সস্তা, তবে নিখরচায় নয়, এখানে দেখুন
নিতসান ওয়াকার্ট

"... আপনি এটি লেখার সময় পুটবজেক্টভোলটাইল ব্যবহার করতে পারেন ..." আমি সরল লেখার পরামর্শ দিচ্ছিলাম না।
ম্যাট ক্রিঙ্কলা-ভোগ্ট

1

আপনার বর্তমানে এটি প্রয়োজন এমন কোনও শ্রেণীর দ্বারা সরবরাহিত কার্যকারিতা প্রতিস্থাপনের প্রয়োজন হলে আপনার এটি দরকার।

এটি কাস্টম / দ্রুত / আরও কমপ্যাক্ট সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন, বাইটবফারের একটি দ্রুত / বৃহত্তর বাফার / পুনরায় আকার পরিবর্তনযোগ্য সংস্করণ হতে পারে বা একটি পারমাণবিক ভেরিয়েবল যুক্ত করতে পারে যেমন বর্তমানে সমর্থিত নয়।

আমি কিছু সময়ের জন্য এইগুলির জন্য এটি ব্যবহার করেছি।



0

জাভা কোড সাধারণত যা অনুমতি দেয় তার চেয়ে কম স্তরে কাজ করার জন্য অবজেক্টটি উপস্থিতি হিসাবে উপস্থিত বলে মনে হয়। আপনি যদি একটি উচ্চ স্তরের অ্যাপ্লিকেশন কোডিং করে থাকেন তবে জেভিএম কোড স্তর থেকে দূরে মেমরি হ্যান্ডলিং এবং অন্যান্য ক্রিয়াকলাপকে বিমূর্ত করে তোলে যাতে প্রোগ্রাম করা সহজ হয়। অনিরাপদ গ্রন্থাগারটি ব্যবহার করে আপনি কার্যকরভাবে নিম্ন-স্তরের অপারেশনগুলি সম্পূর্ণ করছেন যা সাধারণত আপনার জন্য করা হত।

ওলিভিরাজর যেমনটি বলেছিলেন যে "এলোমেলো ()" বীজ হিসাবে অনিরাপদ ব্যবহার করে ঠিক তেমনি অন্যান্য অনেকগুলি অপারেশন অনিরাপদে অন্তর্ভুক্ত বরাদ্দকৃত স্মৃতি () ব্যবহার করবে।

প্রোগ্রামার হিসাবে আপনি সম্ভবত এই লাইব্রেরিটির দরকার পড়ার আগেই পালাতে পারেন তবে নিম্ন-স্তরের উপাদানগুলির উপর কঠোর নিয়ন্ত্রণ রাখা কার্যকর হয়ে আসে (এজন্য এখনও অ্যাসেম্বলি রয়েছে এবং (কিছুটা হলেও) বড় কোডগুলিতে সি কোড প্রবাহিত হচ্ছে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.