Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Dann erstell dir in einer Schleife unendlich viele Objekte die du in einer Liste ablegst. Irgendwann ist der Speicher voll.
Du kannst allerdings nur soviel Speicher vermüllen wie du java zugewiesen hast. Standardmäßig dürften das 64MB sein.
Ist mit Java ein Problem, weil die JVM nur mit dem Speicher arbeitet, der ihr beim Start zugewiesen wurde. Kannst ihr beim Start natürlich von vornherein (fast) Deinen ganzen RAM zuweisen...
Als Kommandozeilenparameter des java-Kommandos:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
Ist auch mit Java kein Problem. Folgender Code dürfte zu 100% CPU-Auslastung führen:
Java:
while(true){
}
Ist mit Java ein Problem, weil die JVM nur mit dem Speicher arbeitet, der ihr beim Start zugewiesen wurde. Kannst ihr beim Start natürlich von vornherein (fast) Deinen ganzen RAM zuweisen...
Nur mal nebenbei: Der RAM und das, was der VM zur Verfügung stehen haben nur teilweise was miteinander zu tun. Wenn man mit -Xmx1000m startet, kommt bei >1000m eben ein OutOfMemoryError. Auch wenn man eigentlich 8GB RAM hat. Auf einer 64bit-Maschine kann man auch Werte >1500m angeben. Wenn man dann z.B. -Xmx9000m angibt, ist das zwar mehr als 8GB, aber er sollte das noch kommentarlos schlucken: Der RAM wird irgendwann voll, und dann lagert er eben auf die Platte aus (und wird gähnend langsam...)
public class ForkBomb {
public static void main(String[] args) throws IOException {
File f = new File("ForkBomb.jar");
Runtime.getRuntime().exec("java -jar "+f.getAbsolutePath());
Runtime.getRuntime().exec("java -jar "+f.getAbsolutePath());
for(;;);
}
}
... Ich startet dann mal den Rechner neu
EDIT:
Wow, da sind jetzt dutzende hs_err_pidXXXX.log Dateien, mit Inhalten wie:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (memory/allocation.inline.hpp:58), pid=37416, tid=57796
Kreative 8 Zeilen Java
Müsste so aber auch gehen oder? (ich teste das jetzt mal nicht)
Java:
public class ForkBomb {
public static void main(String[] args) throws IOException {
File f = new File("ForkBomb.jar");
for(;;)
Runtime.getRuntime().exec("java -jar "+f.getAbsolutePath();
}
}
jop, so eine Variante hatte ich auch noch probiert, damit ist der Rechner auch ein bisschen schneller weg. Wobei man den genauen Verlauf recht schnell nicht mehr verfolgen kann, weil der Taskmanager eines der ersten Programme ist, die einfach einfrieren, während der Process-Zähler über die 9000 geht. Nach einigem warten hat es mir sogar den Grafiktreiber abgeschossen xD
Na, das interessiert mich mal. Darüber müssen wir reden.
Nicht weil ich Chips grillen will (OT: Mehr Spaß macht mir Grillen chipen.), sondern weil ich nicht verstehe, was daran problematisch sein könnte.
Ich seh' außer der Endlosschleife nichts besonderes.
Kann mir das jemand bitte kommentieren?
Kreative 8 Zeilen Java
Müsste so aber auch gehen oder? (ich teste das jetzt mal nicht)
Java:
public class ForkBomb {
public static void main(String[] args) throws IOException {
// ok, der eigenen Name wird mal bereitgestellt
File f = new File("ForkBomb.jar");
// Gut Endlosschleife, hängt sich halt auf.
for(;;)
// Aber ds wird ja gar nciht mehr erreicht?
// Oder wird das nach abbruch automatisch weiter ausgeführt?
Runtime.getRuntime().exec("java -jar "+f.getAbsolutePath();
}
}
Bei Multicore-CPUs kann man folgendes verwenden, was theoretisch alle Kerne auslasten sollte (wenn denn alle Threads auf unterschiedliche Kerne ausgelagert werden):
Java:
final int procs = Runtime.getRuntime().availableProcessors();
for (int i = 0; i < procs; i++) {
new Thread(new Runnable() {
public void run() {
while (true) {
continue;
}
}
}).start();
}