| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -18,4 +18,5 @@ out/ | |||
| 18 | 18 | ||
| 19 | 19 | # Others | |
| 20 | 20 | bin/ | |
| 21 | - .myeclipse | ||
| 21 | + .myeclipse | ||
| 22 | + .hprof | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,14 @@ | |||
| 1 | + <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | + <project xmlns="http://maven.apache.org/POM/4.0.0" | ||
| 3 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 4 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 5 | + <parent> | ||
| 6 | + <artifactId>java-learning</artifactId> | ||
| 7 | + <groupId>com.brianway.learning.java</groupId> | ||
| 8 | + <version>1.0-SNAPSHOT</version> | ||
| 9 | + </parent> | ||
| 10 | + <modelVersion>4.0.0</modelVersion> | ||
| 11 | + | ||
| 12 | + <artifactId>java-jvm</artifactId> | ||
| 13 | + | ||
| 14 | + </project> | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,28 @@ | |||
| 1 | + package com.brianway.learning.java.jvm; | ||
| 2 | + | ||
| 3 | + import sun.misc.Unsafe; | ||
| 4 | + | ||
| 5 | + import java.lang.reflect.Field; | ||
| 6 | + | ||
| 7 | + /** | ||
| 8 | + * Created by brian on 17/3/2. | ||
| 9 | + * 使用 unsafe 分配本机内存 | ||
| 10 | + * VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M | ||
| 11 | + */ | ||
| 12 | + public class DirectMemoryOOM { | ||
| 13 | + private static final int _1MB = 1024 * 1024; | ||
| 14 | + | ||
| 15 | + public static void main(String[] args) throws Exception { | ||
| 16 | + Field unsafeField = Unsafe.class.getDeclaredFields()[0]; | ||
| 17 | + unsafeField.setAccessible(true); | ||
| 18 | + Unsafe unsafe = (Unsafe) unsafeField.get(null); | ||
| 19 | + | ||
| 20 | + while (true) { | ||
| 21 | + unsafe.allocateMemory(_1MB); | ||
| 22 | + } | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + /* | ||
| 27 | + TODO 没出现 OOM | ||
| 28 | + */ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,45 @@ | |||
| 1 | + package com.brianway.learning.java.jvm; | ||
| 2 | + | ||
| 3 | + import java.util.ArrayList; | ||
| 4 | + import java.util.List; | ||
| 5 | + | ||
| 6 | + /** | ||
| 7 | + * Created by brian on 17/3/1. | ||
| 8 | + * Java 堆内存溢出异常测试 | ||
| 9 | + * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError | ||
| 10 | + * (限制堆大小为 20 MB) | ||
| 11 | + */ | ||
| 12 | + public class HeapOOM { | ||
| 13 | + static class OOMObject { | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + public static void main(String[] args) { | ||
| 17 | + List<OOMObject> list = new ArrayList<>(); | ||
| 18 | + | ||
| 19 | + while (true) { | ||
| 20 | + list.add(new OOMObject()); | ||
| 21 | + } | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + /* | ||
| 27 | + java.lang.OutOfMemoryError: Java heap space | ||
| 28 | + Dumping heap to java_pid25599.hprof ... | ||
| 29 | + Heap dump file created [27802397 bytes in 0.106 secs] | ||
| 30 | + Exception in thread "main" java.lang.OutOfMemoryError: Java heap space | ||
| 31 | + at java.util.Arrays.copyOf(Arrays.java:3210) | ||
| 32 | + at java.util.Arrays.copyOf(Arrays.java:3181) | ||
| 33 | + at java.util.ArrayList.grow(ArrayList.java:261) | ||
| 34 | + at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) | ||
| 35 | + at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) | ||
| 36 | + at java.util.ArrayList.add(ArrayList.java:458) | ||
| 37 | + at com.brianway.learning.java.jvm.HeapOOM.main(HeapOOM.java:19) | ||
| 38 | + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | ||
| 39 | + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | ||
| 40 | + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | ||
| 41 | + at java.lang.reflect.Method.invoke(Method.java:498) | ||
| 42 | + at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) | ||
| 43 | + | ||
| 44 | + Process finished with exit code 1 | ||
| 45 | + */ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,45 @@ | |||
| 1 | + package com.brianway.learning.java.jvm; | ||
| 2 | + | ||
| 3 | + /** | ||
| 4 | + * Created by brian on 17/3/1. | ||
| 5 | + * 创建线程导致内存溢出异常 | ||
| 6 | + * VM Args: -Xss2M | ||
| 7 | + */ | ||
| 8 | + public class JavaVMStackOOM { | ||
| 9 | + private void dontStop() { | ||
| 10 | + while (true) { | ||
| 11 | + } | ||
| 12 | + } | ||
| 13 | + | ||
| 14 | + public void stackLeakByThread() { | ||
| 15 | + while (true) { | ||
| 16 | + Thread thread = new Thread(new Runnable() { | ||
| 17 | + @Override | ||
| 18 | + public void run() { | ||
| 19 | + dontStop(); | ||
| 20 | + } | ||
| 21 | + }); | ||
| 22 | + thread.start(); | ||
| 23 | + } | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public static void main(String[] args) { | ||
| 27 | + JavaVMStackOOM oom = new JavaVMStackOOM(); | ||
| 28 | + oom.stackLeakByThread(); | ||
| 29 | + } | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + /* | ||
| 33 | + Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated | ||
| 34 | + Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread | ||
| 35 | + at java.lang.Thread.start0(Native Method) | ||
| 36 | + at java.lang.Thread.start(Thread.java:714) | ||
| 37 | + at com.brianway.learning.java.jvm.JavaVMStackOOM.stackLeakByThread(JavaVMStackOOM.java:22) | ||
| 38 | + at com.brianway.learning.java.jvm.JavaVMStackOOM.main(JavaVMStackOOM.java:28) | ||
| 39 | + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | ||
| 40 | + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | ||
| 41 | + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | ||
| 42 | + at java.lang.reflect.Method.invoke(Method.java:498) | ||
| 43 | + at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) | ||
| 44 | + | ||
| 45 | + */ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,50 @@ | |||
| 1 | + package com.brianway.learning.java.jvm; | ||
| 2 | + | ||
| 3 | + /** | ||
| 4 | + * Created by brian on 17/3/1. | ||
| 5 | + * 虚拟机栈和本地方法栈 OOM 测试 | ||
| 6 | + * VM Args: -Xss256k | ||
| 7 | + */ | ||
| 8 | + public class JavaVMStackSOF { | ||
| 9 | + private int stackLength = 1; | ||
| 10 | + | ||
| 11 | + public void stackLeak() { | ||
| 12 | + stackLength++; | ||
| 13 | + stackLeak(); | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + public static void main(String[] args) { | ||
| 17 | + JavaVMStackSOF oom = new JavaVMStackSOF(); | ||
| 18 | + | ||
| 19 | + try { | ||
| 20 | + oom.stackLeak(); | ||
| 21 | + } catch (Throwable e) { | ||
| 22 | + System.out.println("stack length:" + oom.stackLength); | ||
| 23 | + throw e; | ||
| 24 | + } | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + /* | ||
| 30 | + stack length:1862 | ||
| 31 | + Exception in thread "main" java.lang.StackOverflowError | ||
| 32 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:12) | ||
| 33 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 34 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 35 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 36 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 37 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 38 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 39 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 40 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 41 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 42 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 43 | + at com.brianway.learning.java.jvm.JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:13) | ||
| 44 | + | ||
| 45 | + ..... | ||
| 46 | + | ||
| 47 | + | ||
| 48 | + | ||
| 49 | + Process finished with exit code 1 | ||
| 50 | + */ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,48 @@ | |||
| 1 | + package com.brianway.learning.java.jvm; | ||
| 2 | + | ||
| 3 | + import java.util.ArrayList; | ||
| 4 | + import java.util.List; | ||
| 5 | + | ||
| 6 | + /** | ||
| 7 | + * Created by brian on 17/3/2. | ||
| 8 | + * 运行时常量池导致的内存溢出异常 | ||
| 9 | + * VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M | ||
| 10 | + * | ||
| 11 | + * 这两个配置项在 JDK 1.8 已经不支持了 | ||
| 12 | + */ | ||
| 13 | + public class RuntimeConstantPoolOOM { | ||
| 14 | + public static void main(String[] args) { | ||
| 15 | + | ||
| 16 | + testEqual(); | ||
| 17 | + | ||
| 18 | + //使用 List 保持着常量引用,避免被 Full GC 回收常量池行为 | ||
| 19 | + List<String> list = new ArrayList<>(); | ||
| 20 | + | ||
| 21 | + //10MB 的 PermSize 在 integer 范围内足够产生 OOM 了 | ||
| 22 | + int i = 0; | ||
| 23 | + while (true) { | ||
| 24 | + list.add(String.valueOf(i++).intern()); | ||
| 25 | + } | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * JDK 1.8 | ||
| 30 | + * true | ||
| 31 | + * false | ||
| 32 | + * intern()不会再复制实例,只是在常量池中记录首次出现的实例引用 | ||
| 33 | + */ | ||
| 34 | + private static void testEqual(){ | ||
| 35 | + String str1 = new StringBuilder("计算机").append("软件").toString(); | ||
| 36 | + System.out.println(str1.intern() == str1);// true | ||
| 37 | + | ||
| 38 | + String str2 = new StringBuilder("ja").append("va").toString(); | ||
| 39 | + System.out.println(str2.intern() == str2);// false | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + | ||
| 44 | + | ||
| 45 | + /* | ||
| 46 | + Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=10M; support was removed in 8.0 | ||
| 47 | + Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=10M; support was removed in 8.0 | ||
| 48 | + */ | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -51,6 +51,7 @@ | |||
| 51 | 51 | <module>java-container</module> | |
| 52 | 52 | <module>java-io</module> | |
| 53 | 53 | <module>java8</module> | |
| 54 | + <module>java-jvm</module> | ||
| 54 | 55 | </modules> | |
| 55 | 56 | ||
| 56 | 57 | <dependencyManagement> | |
| Back | FazBrowse Home | New Git URL |
0 commit comments