JVM知識專欄JVM-火種,持續更新,喜歡請關注😍
jvm知識對於java開發人員的重要性不言而喻,我們看了各種jvm優化、垃圾回收算法、內存調優的知識點,早就摩拳擦掌想優化實戰,奈何程序偏偏不溢出了,不溢出還怎麼優化啊!下面幾段代碼能有針對虐爆JVM各個內存區。
java.lang.OutOfMemoryError: Java heap space 堆溢出
public static void main(String[] args) {
List<Byte[]> list = new ArrayList<Byte[]>();
while (true) {
list.add(new Byte[1024*1024]);
}
}
java.lang.OutOfMemoryError: Direct buffer memory 直接內存溢出
public static void main(String[] args) throws Exception {
Field field = Unsafe.class.getDeclaredFields()[0];
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
while (true) {
unsafe.allocateMemory(1024*1024);
}
}
java.lang.StackOverflowError 棧溢出
public class TestClass {
public static void main(String[] args) {
new TestClass().test();
}
public void test() {
test();
}
}
java.lang.OutOfMemoryError-->Metaspace 永久區溢出
public static void main(String[] args) {
while(true){
try {
BeanGenerator generator = new BeanGenerator();
generator.addProperty("PermGenOOM" + Math.random(), Class.forName("java.io.File"));
generator.create();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
java.lang.OutOfMemoryError: unable to create new nativ thread 線程過多
public static void main(String[] args) {
while (true){
new Thread() {
@Override
public void run() {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
deadlock 線程死鎖
private static final Object A=new Object();
private static final Object B=new Object();
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
synchronized (A) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("拿到A的鎖並且拿到B的鎖");
}
}
}
}.start();
new Thread() {
@Override
public void run() {
synchronized (B) {
synchronized (A) {
System.out.println("拿到B的鎖並且拿到A的鎖");
}
}
}
}.start();
}
說明: 詳細的知識點就不再談了,簡單的說JVM將內存劃分爲多個區域,每個區域管理的特點不同。執行上述代碼出錯的原因就是找到對應內存區一直懟,內存裝不下就報錯了。不過最後一個線程死鎖從控制檯是看不到報錯的,可以通過線程dump文件看到對應的錯誤內容。
JVM好文推薦:
OutOfMemoryError:PermGen space
一次線上系統OutOfMemoryError問題定位及原因分析
JVM參數解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC
GC參數解析 UseSerialGC、UseParNewGC、UseParallelGC、UseConcMarkSweepGC
覺得不錯,請關注或贊 (-__-)謝謝