কীভাবে আপনি একটি জেভিএম ক্রাশ করবেন?


144

আমি প্রোগ্রামিং দক্ষতার উপর একটি বই পড়ছিলাম যেখানে লেখক ইন্টারভিউওয়াকে জিজ্ঞাসা করেছিলেন, "আপনি কীভাবে জেভিএমকে বিধ্বস্ত করেন?" আমি ভেবেছিলাম যে আপনি এমন একটি অসীম লুপ লিখে শেষ পর্যন্ত সমস্ত স্মৃতি ব্যবহার করতে পারেন।

কারও কোন ধারণা আছে?



stackoverflow.com/questions/30072883/... "একসাথে যদি আমি JDK1.8_40 অথবা ঊর্ধ্বতন সংস্করণ (ওরাকল বা OpenJDK একই কাজ) ব্যবহার, নিম্নলিখিত কোড একটি ডায়ালগ পুনরায় আকার দেওয়ার আবেদন বিপর্যস্ত হবে (চেষ্টা উইন্ডোজ 7, x64, 64bit JDK)" - কোডটি কেবল 40 টি লাইন এবং এটি জেভিএমের যথাযথ ক্র্যাশ ঘটায় ।
ড্রিমস্পেসের রাষ্ট্রপতি

উত্তর:


6

একটি একক "উত্তর" এর নিকটতম জিনিসটি System.exit()যা সঠিকভাবে পরিষ্কার ছাড়াই JVM অবিলম্বে সমাপ্ত করে। তবে সেগুলি বাদে, নেটিভ কোড এবং সংস্থানসমূহের ক্লান্তি সবচেয়ে সম্ভবত উত্তর। বিকল্পভাবে আপনি জেভিএম এর আপনার সংস্করণে বাগগুলির জন্য সূর্যের বাগ ট্র্যাকারটির সন্ধান করতে পারেন, যার মধ্যে কয়েকটি পুনরায় পুনরুক্তযোগ্য ক্র্যাশ পরিস্থিতির জন্য অনুমতি দেয়। আমরা 32-বিট সংস্করণগুলির অধীনে 4 গিগাবাইট মেমরির সীমা অতিক্রম করার সময় আধা-নিয়মিত ক্র্যাশগুলি ব্যবহার করতাম (আমরা এখন সাধারণভাবে 64-বিট ব্যবহার করি)।


71
সঠিক পরিষ্কার ছাড়াই? তুমি কি নিশ্চিত? ডকুমেন্টেশনটিতে বলা হয়েছে "বর্তমানে চালু জাভা ভার্চুয়াল মেশিনটি তার শাটডাউন ক্রম শুরু করে দিয়ে শেষ করে ... সমস্ত নিবন্ধিত শাটডাউন হুক, যদি থাকে তবে শুরু করা হয় ... সমস্ত নিমন্ত্রিত ফাইনালাইজার চালানো হয়" - এটি কি সঠিক পরিষ্কারনা নয়?
ব্যবহারকারী 85421

51
এটি জেভিএমকে ক্র্যাশ করছে না, এটি উদ্দেশ্যমূলকভাবে এবং স্পষ্টতই মৃত্যুদন্ড কার্যকর করার একটি সুশৃঙ্খল শাট ডাউন শুরু করে।
বেনম

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

48
এটি সত্যিই একটি খারাপ উত্তর।
আন্তোনিও

174

আমি কোনও আউটআফমিউরিওর বা স্ট্যাকওভারফ্লোএরর ক্র্যাশকে কল করব না। এগুলি কেবলমাত্র সাধারণ ব্যতিক্রম। সত্যিই কোনও ভিএম ক্র্যাশ করার জন্য 3 টি উপায় রয়েছে:

  1. নেটিভ কোডে জেএনআই এবং ক্রাশ ব্যবহার করুন।
  2. কোনও সুরক্ষা পরিচালক ইনস্টল না করা থাকলে আপনি ভিএম ক্র্যাশ করার জন্য প্রতিবিম্বটি ব্যবহার করতে পারেন। এটি ভিএম নির্দিষ্ট, তবে সাধারণত একটি ভিএম ব্যক্তিগত ক্ষেত্রগুলিতে স্থানীয় সংস্থাগুলিতে পয়েন্টারগুলির একটি গোছা সংরক্ষণ করে (যেমন দেশী থ্রেড অবজেক্টের একটি পয়েন্টার জাভা.লাং.থ্রেডে একটি দীর্ঘ ক্ষেত্রে সংরক্ষণ করা হয় )। প্রতিবিম্বের মাধ্যমে কেবল সেগুলি পরিবর্তন করুন এবং VM শীঘ্রই বা পরে ক্রাশ হবে।
  3. সমস্ত ভিএমগুলিতে বাগ রয়েছে, তাই আপনাকে কেবল একটি ট্রিগার করতে হবে।

শেষ পদ্ধতির জন্য আমার একটি সংক্ষিপ্ত উদাহরণ রয়েছে, যা একটি সান হটস্পট ভিএম শান্তভাবে ক্র্যাশ করবে:

public class Crash {
    public static void main(String[] args) {
        Object[] o = null;

        while (true) {
            o = new Object[] {o};
        }
    }
}

এটি জিসিতে স্ট্যাকের ওভারফ্লোতে বাড়ে তাই আপনি কোনও স্ট্যাকওভারফ্লো এরিয়ার পাবেন না তবে একটি hs_err * ফাইল সহ একটি আসল ক্রাশ পাবেন।


9
কি দারুন! এটি সান জাভা 5, সান জাভা 6 এবং ওপেনজেডিকে 6 (উবুন্টু 9.04-এ) কোনও hs_err * ফাইল ছাড়াই ক্র্যাশ করে কেবল একটি "সেগমেন্টেশন দোষ!" ...
জোছিম সউর

1
সিস্টেম.এক্সিট () কোনও জেভিএম ক্র্যাশ করার অনেক সহজ উপায় (যদি না কোনও সুরক্ষা ব্যবস্থাপক ইনস্টল করা থাকে)
ইনস্ট্যান্টসেটসুন

4
কখন এটি ঠিক করা হয়েছে তা জানেন না, তবে কেবলমাত্র 1.7.0_09 এ পরীক্ষা করা হয়েছে এবং এটি ঠিক আছে। সবেমাত্র প্রত্যাশিতটি পেয়েছি: থ্রেড "মূল" java.lang.OutOfMemoryError মধ্যে ব্যতিক্রম: CrashJVM.main এ জাভা হ্যাপ স্পেস (CrashJVM.java:7)
চাদ এনবি

2
আমি উপরের কোডটি ইন্টেল কোর আই 7 2.4 গিগাহার্টজ / 8 জিবি র‌্যাম / জেডি কে 1.7 64 বাইটে চেষ্টা করেছি তবে 20 মিনিটের পরেও জেভিএম আপ আপ। (মজার: আমার ল্যাপটপ ফ্যান আকাশের একটি ফাইটার জেটের চেয়ে জোরে ছিল)। এই সমস্যাটি কি জেডিকে 1.7+ এ স্থির?
রিয়েলপিকে

3
জেডিকে 1.8_u71 এ এটির কারণ java.lang.OutOfMemoryError: GC overhead limit exceeded
ঘটে

124

জেএনআই । আসলে, জেএনআই-এর সাথে ক্রাশ করা অপারেশনের ডিফল্ট মোড। এটি ক্রাশ না হওয়ার জন্য আপনাকে অতিরিক্ত কঠোর পরিশ্রম করতে হবে।


4
সম্ভবত জেএনআইয়ের ডিজাইনাররা কেবল ক্র্যাশ-কেবল সফ্টওয়্যার সম্পর্কে শুনেছিলেন , তবে ধারণাটি বেশ ধারণ করেননি।
টম অ্যান্ডারসন

56

এটা ব্যবহার কর:

import sun.misc.Unsafe;

public class Crash {
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    public static void crash() {
        unsafe.putAddress(0, 0);
    }
    public static void main(String[] args) {
        crash();
    }
}

এই শ্রেণিটি অবশ্যই বুট শ্রেণিপথে থাকতে হবে কারণ এটি বিশ্বস্ত কোড ব্যবহার করছে, সুতরাং এটির মতো চালান:

java -Xbootclasspath / p :. ক্র্যাশ


14
-জবুটক্লাসপাথ ব্যবহার না করে আপনি কেবল এটি করতে পারেন: Field f = Unsafe.class.getDeclaredField( "theUnsafe" ); f.setAccessible( true ); unsafe = (Unsafe) f.get( null );আমার জন্য দুর্দান্ত কাজ করেছেন।
6:50

Unsafeসংজ্ঞা অনুসারে, "অনিরাপদ"। এটি কিছুটা ধোঁকাবাজি।
হট লিকস

1
ব্যবহার কাজ নিশ্চিত getDeclaredFieldলিনাক্স x64 উপর JDK 8u131 মধ্যে কৌতুক, উৎপাদন সহ hs_err_pid*.logA থেকে SIGSEGV
জেসি গ্লিক

ব্যবহার Unsafeকরা প্রতারণা নয়। ওপি প্রোগ্রামিং সমস্যার কোনও 'ক্লিন' সমাধান খুঁজছে না। কুৎসিত সম্ভাব্য উপায়ে ক্র্যাশ করতে তার jvm দরকার। দুষ্টু নেটিভ জিনিসগুলি করা যা ঘটতে পারে তা হ'ল এবং ঠিক এটিই ঘটে Unsafe
jvdneste

34

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

বিশেষত, তিনি জিজ্ঞাসা করেছেন:

খাঁটি জাভাতে আপনি কীভাবে কোনও প্রোগ্রাম লিখবেন, যার ফলে জাভা ভার্চুয়াল মেশিন ক্র্যাশ হবে?

আমি জাভাতে 15 বছরেরও বেশি সময় ধরে প্রোগ্রাম করেছি এবং এই প্রশ্নটি আমি দুশ্চরিত্র এবং অন্যায় উভয়ই বলে মনে করেছি। অন্যরা যেমন উল্লেখ করেছে, জাভা, একটি পরিচালিত ভাষা হিসাবে, বিশেষত ক্র্যাশ না করার জন্য তৈরি করা হয়েছে । অবশ্যই সবসময় জেভিএম বাগ রয়েছে তবে:

  1. উত্পাদন স্তরের জেআরআর 15+ বছর পরে, এটি বিরল।
  2. পরের রিলিজে এ জাতীয় কোনও বাগ প্যাচ হওয়ার সম্ভাবনা রয়েছে, সুতরাং আপনি জেআরই শো-স্টপারদের বর্তমান সেটটির বিশদটি পুনরায় স্মরণ করার জন্য প্রোগ্রামার হিসাবে কতটা সম্ভব?

অন্যরা যেমন উল্লেখ করেছে, জেএনআই এর মাধ্যমে কিছু নেটিভ কোড হ'ল একটি জেআরই ক্র্যাশ করার একটি নিশ্চিত উপায়। তবে লেখক বিশুদ্ধ জাভাতে বিশেষভাবে উল্লেখ করেছেন , তাই এটি বাইরে।

আর একটি বিকল্প জেআরই বোগাস বাইট কোডগুলি খাওয়ানো হবে; একটি ক্লাস ফাইলে কিছু জঞ্জাল বাইনারি ডেটা ফেলে দেওয়া এবং জেআরই কে এটি চালিয়ে যেতে বলার পক্ষে যথেষ্ট সহজ:

$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap

সেটা কি হিসাবের মধ্যে আসে? মানে জেআরই নিজেই ক্র্যাশ হয়নি; এটি সঠিকভাবে বোগাস কোড সনাক্ত করেছে, এটি প্রতিবেদন করেছে এবং প্রস্থান করেছে।

এটি আমাদের সুনির্দিষ্ট ধরণের সমাধানগুলির সাথে ফেলেছে যেমন পুনরাবৃত্তির মাধ্যমে স্ট্যাকটি ফুঁ দেওয়া, বস্তুর বরাদ্দের মাধ্যমে গাদা স্মৃতি থেকে বেরিয়ে আসা বা কেবল নিক্ষেপ করা RuntimeException। তবে এটি কেবল জেআরইকে একটি StackOverflowErrorবা অনুরূপ ব্যতিক্রম সহ প্রস্থান করতে পারে , যা সত্যই আবার কোনও ক্রাশ নয়

তাহলে কি বাকি আছে? আমি যথাযথ সমাধান হিসাবে লেখকের মনে কী ছিল তা শুনতে সত্যিই আমি পছন্দ করব।

আপডেট : চাদ ফোলার এখানে প্রতিক্রিয়া জানিয়েছেন

পিএস: এটি অন্যথায় দুর্দান্ত বই। আমি রুবি শেখার সময় এটি নৈতিক সহায়তার জন্য তুলেছি।


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

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

20

এই কোডটি জেভিএমকে বাজে উপায়ে ক্রাশ করবে

import sun.dc.pr.PathDasher; 

public class Crash
{
     public static void main(String[] args)
     {    
        PathDasher dasher = new PathDasher(null) ;
     }
}

1
এই কোডটি সহ জেডিকে
রিয়েলপিকে

7
এটি InternalErrorJDK 1.8 এ একটি ছুড়ে ফেলে । জেভিএম আর ব্যর্থ হয় না।
সোটিরিওস ডেলিমনোলিস

18

শেষবার আমি চেষ্টা করেছিলাম এটি করবে:

public class Recur {
    public static void main(String[] argv) {
        try {
            recur();
        }
        catch (Error e) {
            System.out.println(e.toString());
        }
        System.out.println("Ended normally");
    }
    static void recur() {
        Object[] o = null;
        try {
            while(true) {
                Object[] newO = new Object[1];
                newO[0] = o;
                o = newO;
            }
        }
        finally {
            recur();
        }
    }
}

উত্পন্ন লগ ফাইলের প্রথম অংশ:

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x000000006dad5c3d, pid=6752, tid=1996
#
# Java VM: Java HotSpot(TM) 64-Bit Server VM (11.2-b01 mixed mode windows-amd64)
# Problematic frame:
# V  [jvm.dll+0x2e5c3d]
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x00000000014c6000):  VMThread [stack: 0x0000000049810000,0x0000000049910000] [id=1996]

siginfo: ExceptionCode=0xc00000fd, ExceptionInformation=0x0000000000000001 0x0000000049813fe8 

Registers:
EAX=0x000000006dc83090, EBX=0x000000003680f400, ECX=0x0000000005d40ce8, EDX=0x000000003680f400
ESP=0x0000000049813ff0, EBP=0x00000000013f2df0, ESI=0x00000000013f0e40, EDI=0x000000003680f400
EIP=0x000000006dad5c3d, EFLAGS=0x0000000000010206

ডাউনটাতে আমি কিছুটা আনন্দিত, প্রদত্ত এই যে জাভা কোডের সাথে খাঁটিভাবে কীভাবে এটি করা যায় তা দেখানোর একমাত্র দুটি উত্তরগুলির মধ্যে এটির একটি এবং এতে সম্পূর্ণ কোড অন্তর্ভুক্ত রয়েছে।
হট লিক্স 7:15

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

@ বিলক - না, উপরেরটি সম্পূর্ণ আমার নিজের কাজ, যদিও আমি এটির সাথে বেশ কয়েক বছর আগে বিভিন্ন জিনিস নিয়ে পরীক্ষা-নিরীক্ষা করে এসেছি। একটি সাক্ষাত্কারে আমি সম্ভবত বলব "চেষ্টা / ধরা এবং পুনরাবৃত্তি ব্যবহার করে আমি এটি করেছি, তবে আমি ঠিক এখনই সঠিক কোডটি ফাঁস করতে পারি না।"
হট লিক্স

1
বিশদগুলি (জেডিকে সংস্করণ, কোনও ভিএম যুক্তি) কী কী? "11.2-বি0" সংস্করণটি কী তা নিশ্চিত। আমি এটি চালাচ্ছি, তবে এটি কেবলমাত্র প্রচুর সিপিইউ গ্রহণ করে।
স্টিফান রেইচ

@ হট লিকস: জেভিএম ক্রাশের উদাহরণে ধারণাটি কী? কেন JVM কোড সম্পর্কে ক্র্যাশ করে। সমস্ত থ্রেডের পৃথক স্ট্যাক থ্রেড রয়েছে ...
ভিজেএস

15

একটি নিখুঁত জেভিএম বাস্তবায়ন কখনই ক্রাশ হবে না।

একটি জেভিএম ক্র্যাশ করতে, জেএনআইকে বাদ দিয়ে, আপনাকে নিজেই ভিএম-তে একটি বাগ খুঁজে পাওয়া দরকার। একটি অসীম লুপটি কেবলমাত্র সিপিইউ গ্রহণ করে। অসীমভাবে মেমরি বরাদ্দ করা কেবল একটি ভাল নির্মিত জেভিএম-এ আউটআফমিউরিওর এর কারণ হওয়া উচিত। এটি সম্ভবত অন্যান্য থ্রেডের জন্য সমস্যা তৈরি করতে পারে তবে একটি ভাল জেভিএম এখনও ক্র্যাশ হওয়া উচিত নয়।

আপনি যদি ভিএম এর উত্স কোডটিতে একটি বাগ খুঁজে পেতে পারেন এবং উদাহরণস্বরূপ ভিএম প্রয়োগের মেমরির ব্যবহারে একটি সেগমেন্টেশন ত্রুটি সৃষ্টি করে, তবে আপনি আসলে এটি ক্রাশ করতে পারেন।


14

আপনি যদি জেভিএম ক্র্যাশ করতে চান - সান জেডিকে 1.6_23 বা নীচে নিম্নলিখিতটি ব্যবহার করুন:

Double.parseDouble("2.2250738585072012e-308");

এটি সান জেডিকে-র একটি বাগের কারণে - ওপেনজেডিকেও পাওয়া গেছে। এটি ওরাকল জেডিকে 1.6_24 এর পরে স্থির করা হয়েছে।


10

ক্র্যাশ দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে।

এটিকে স্ট্যাকের জায়গা থেকে সরিয়ে দেওয়ার জন্য আপনি একটি অসীম পুনরাবৃত্তি করতে পারেন, তবে এটি "করুণভাবে" ক্র্যাশ হয়ে যাবে। আপনি একটি ব্যতিক্রম পাবেন, কিন্তু জেভিএম নিজেই সমস্ত কিছু পরিচালনা করবে।

নেটিভ কোডটি কল করতে আপনি জেএনআই ব্যবহার করতে পারেন। আপনি যদি ঠিক এটি না করেন তবে আপনি এটিকে শক্ত করে ক্রাশ করতে পারেন। এই ক্র্যাশগুলির ডিবাগ করা "মজাদার" (বিশ্বাস করুন, আমাকে একটি বড় সি ++ ডিএলএল লিখতে হয়েছিল যা আমরা স্বাক্ষরিত জাভা অ্যাপলেট থেকে কল করি)। :)


6

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


5

winxpsp2 w / wmp10 jre6.0_7 এ

Desktop.open (uriToAviOrMpgFile)

এটি একটি স্পাড থ্রেডের জন্য একটি অচিরত থ্রোয়েবল নিক্ষেপ করে এবং হটস্পট ক্র্যাশ করে

YMMV


5

ভাঙা হার্ডওয়্যার যে কোনও প্রোগ্রাম ক্রাশ করতে পারে। ঠিক একই সেটআপ সহ অন্যান্য মেশিনগুলিতে জরিমানা চালানোর সময় আমি একবারে একটি নির্দিষ্ট মেশিনে প্রজননযোগ্যভাবে একটি অ্যাপ ক্রাশ করেছি। দেখা যাচ্ছে যে মেশিনটিতে ত্রুটিযুক্ত র‌্যাম রয়েছে।


5

সবচেয়ে কম উপায় :)

public class Crash
{
    public static void main(String[] args)
    {
        main(args);
    }
}

ক্রাশ হয় না। এটি সংকলন সময় ত্রুটি দেয় Exception in thread "main" java.lang.StackOverflowError at Test.main। আমি jdk1.8.0_65 ব্যবহার করছি
ইরফান

5

ক্র্যাশ নয়, ব্যবহারের স্বীকৃত উত্তরের চেয়ে ক্রাশের কাছাকাছি System.exit

আপনি কল করে জেভিএম থামাতে পারেন

Runtime.getRuntime().halt( status )

ডক্স অনুসারে: -

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



4

আপনি যদি ভান করতে চান তবে আপনার স্মৃতি শেষ হয়ে গেছে আপনি করতে পারেন

public static void main(String[] args) {
    throw new OutOfmemoryError();
}

আমি জেভিএমকে স্থানীয় পদ্ধতিতে (যা অন্তর্নির্মিত রয়েছে) কল করে একটি ত্রুটি ফাইল ডাম্প করার কয়েকটি উপায় জানি, তবে এটি সম্ভবত আপনি কীভাবে করবেন তা জানেন না। ;)


4

যদি আপনি কোনও নিয়ন্ত্রণহীন পরিস্থিতিতে (যেমন কোনও জাভা ব্যতিক্রম বা ত্রুটি নেই) কোনও প্রক্রিয়া বাতিল হিসাবে ক্র্যাশটিকে সংজ্ঞায়িত করেন তবে জাভা থেকে এটি করা যাবে না (যদি আপনি sun.misc.Unsafe বর্গ ব্যবহার করার অনুমতি না পান)। এটি পরিচালিত কোডের পুরো পয়েন্ট।

স্থানীয় কোডে সাধারণ ক্র্যাশগুলি ভুল মেমরি অঞ্চলে (নাল ঠিকানা বা মিসলাইনযুক্ত) ডি-রেফারেন্সিংয়ের মাধ্যমে ঘটে। অন্য উত্স হ'ল অবৈধ মেশিনের নির্দেশাবলী (অপকডস) বা গ্রন্থাগার বা কার্নেল কলগুলি থেকে আনহ্যান্ডেল সংকেত হতে পারে। JVM বা সিস্টেম লাইব্রেরিতে বাগ থাকলে উভয়ই ট্রিগার করতে পারে।

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

লিনাক্স / ইউনিক্সে আপনি কোনও চলমান প্রক্রিয়াতে সিগন্যাল প্রেরণ করে খুব সহজেই একটি জেভিএম ক্রাশ করতে পারবেন। দ্রষ্টব্য: আপনার SIGSEGVজন্য এটি ব্যবহার করা উচিত নয় , যেহেতু হটস্পট এই সংকেতটি ধরেছে এবং বেশিরভাগ জায়গায় এটি একটি নালপয়েন্টার এক্সসেপশন হিসাবে আবার ছুঁড়ে দেয়। সুতরাং SIGBUSউদাহরণ হিসাবে একটি প্রেরণ করা ভাল ।


3

জেএনআই ক্রাশগুলির একটি বৃহত উত্স। আপনি জেভিএমটিআই ইন্টারফেস ব্যবহার করে ক্র্যাশও করতে পারেন যেহেতু সেইসাথে সি / সি ++ তেও লেখা দরকার।


2

যদি আপনি এমন একটি থ্রেড প্রক্রিয়া তৈরি করেন যা অসীমভাবে আরও বেশি থ্রেড তৈরি করে (যা আরও থ্রেড উত্পন্ন করে, যা ...) আপনি শেষ পর্যন্ত জেভিএম নিজেই একটি স্ট্যাক ওভারফ্লো ত্রুটির কারণ হবেন।

public class Crash {
    public static void main(String[] args) {

        Runnable[] arr = new Runnable[1];
        arr[0] = () -> {

            while (true) {
                new Thread(arr[0]).start();
            }
        };

        arr[0].run();
    }
}

এটি আমাকে আউটপুট দিয়েছে (5 মিনিটের পরে, আপনার ম্যাম দেখুন)

An unrecoverable stack overflow has occurred.
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x0000000070e53ed7, pid=12840, tid=0x0000000000101078
#
# JRE version: Java(TM) SE Runtime Environment (8.0_144-b01) (build 1.8.0_144-b01)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# 

1

যদি "ক্র্যাশ" বলতে বোঝায় আপনি জেভিএম এর হঠাৎ বন্ধ হওয়া বোঝা গেছেন , যেমন জেভিএম এর hs_err_pid% p.log এ লিখতে বাধ্য করে , আপনি এটি এইভাবে করতে পারেন।

এক্স-এক্সএএমএক্স আরগটিকে একটি ছোট মানতে সেট করুন এবং জেভিএমকে আউটফেমোমরিতে ক্র্যাশ করার জন্য বলুন:

 -Xmx10m -XX:+CrashOnOutOfMemoryError

পরিষ্কার করার জন্য, উপরের দ্বিতীয়টি আর্গুমেন্ট ব্যতীত এটি jvm এর ফলাফল কেবল একটি আউটআফমিউরিইরির দিয়ে শেষ হবে তবে এটি "ক্র্যাশ" বা হঠাৎ করে জেভিএমকে বাতিল করতে পারে না।

আমি যখন জেভিএম-এক্সএক্স: ত্রুটি-ফাইল আর্গ পরীক্ষা করার চেষ্টা করছিলাম তখন এই কৌশলটি সহায়ক হিসাবে প্রমাণিত হয়েছিল, যেখানে এই জাতীয় hs_err_pid লগ লিখতে হবে তা নিয়ন্ত্রণ করে। এ জাতীয় ক্রাশ জোর করার উপায়গুলি খুঁজতে গিয়ে আমি এই পোস্টটি এখানে পেয়েছি। পরে যখন আমি আমার প্রয়োজনের জন্য উপরের কাজটি সবচেয়ে সহজ হিসাবে কাজ করেছিলাম তখন আমি এটিকে এখানে তালিকায় যুক্ত করতে চেয়েছিলাম।

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


0

আপনি যদি লুপের জন্য সেই অসীমটিকে একই ক্রিয়াকলাপে পুনরাবৃত্ত কলগুলিতে পরিবর্তন করেন তবে আপনি একটি স্ট্যাক ওভারফ্লো ব্যতিক্রম পাবেন:

public static void main(String[] args) {
    causeStackOverflow();
}

public void causeStackOverflow() {
    causeStackOverflow();
}

0

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


আপনার হার্ডওয়্যার, বিশেষত আপনার মেমরি পরীক্ষা করা শুরু করুন!
থরবজর্ন রাভন অ্যান্ডারসন

দুর্ভাগ্যক্রমে, এটি একাধিক মেশিনে রয়েছে যা অন্যথায় ঠিক ঠিক চলে। এটি কেবলমাত্র এটির একটি বিশেষ অ্যাপ যা এটি করে (এবং এটি মেমরি বা প্রসেসরের নিবিড় নয়)।
ব্রায়ান নোব্লাচ

0

সংক্ষিপ্ততম? CTRL + BREAK ট্রিগার করতে রোবট ক্লাস ব্যবহার করুন। আমি যখন কনসোলটি বন্ধ না করেই আমার প্রোগ্রামটি বন্ধ করার চেষ্টা করছিলাম তখন আমি এটি স্পট করেছিলাম (এটির কোনও 'প্রস্থান' কার্যকারিতা ছিল না)।


পুরানো প্রশ্ন - আশা করি ভবিষ্যতে কেউ আপনার উত্তর থেকে উপকৃত হবে।
dbmitch

0

এই কি গণনা?

long pid = ProcessHandle.current().pid();
try { Runtime.getRuntime().exec("kill -9 "+pid); } catch (Exception e) {}

এটি শুধুমাত্র লিনাক্স এবং জাভা 9 থেকে কাজ করে।

কিছু কারণে আমি পাচ্ছি না, ProcessHandle.current().destroyForcibly();জেভিএমকে হত্যা করবে না এবং java.lang.IllegalStateExceptionমেসেজ সহ নিক্ষেপ করবে যাতে বর্তমান প্রক্রিয়া নষ্ট না হয়


0

JVM ক্র্যাশটির প্রতিলিপি দেওয়ার চেষ্টা করার সময় এই সমস্যাটিতে চলছে।

জনি কাজ করে তবে বিভিন্ন প্ল্যাটফর্মের জন্য এটি টুইট করা দরকার। শেষ পর্যন্ত, আমি জেভিএম ক্রাশ করতে এই সংমিশ্রণটি ব্যবহার করি

  1. এই JVM বিকল্পগুলি দিয়ে অ্যাপ্লিকেশন শুরু করুন -XX:+CrashOnOutOfMemoryError
  2. long[] l = new long[Integer.MAX_VALUE];OOM কে ট্রিগার করতে একটি ব্যবহার করুন

তারপরে জেভিএম ক্র্যাশ করে লগ তৈরি করবে and


-2

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

public static void main(String args[]){
   int i = 1/0;
   System.out.print(i); // This part will not be executed due to above  unhandled exception
  }

সুতরাং, এটি ক্র্যাশ কি ধরণের উপর নির্ভর করে ?!


3
ব্যতিক্রম ছুঁড়ে ফেলা কোনও ক্র্যাশ নয়।
কাজী ইরফান

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