Skip to content

Commit b024c36

Browse files
committed
[add] add module java-jvm
1 parent 772c78a commit b024c36

File tree

8 files changed

+233
-1
lines changed

8 files changed

+233
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ out/
1818

1919
# Others
2020
bin/
21-
.myeclipse
21+
.myeclipse
22+
.hprof

java-jvm/pom.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff 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>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
*/
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
*/
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
*/
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
*/
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
*/

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<module>java-container</module>
5252
<module>java-io</module>
5353
<module>java8</module>
54+
<module>java-jvm</module>
5455
</modules>
5556

5657
<dependencyManagement>

0 commit comments

Comments
 (0)