Skip to content

Commit deae78d

Browse files
添加JVM相关的代码示例
1 parent 66ff680 commit deae78d

10 files changed

+271
-8
lines changed

README.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
11
# JavaDemo
22
Java相关Demo代码实现
33

4-
## A 基础
4+
## 项目内容
5+
### A 基础
56
- [ ] 输入输出
67
- [x] 字符串
78

8-
## B 面向对象
9+
### B 面向对象
910
- [ ] 类的继承
1011
- [ ] 类的扩展
11-
12-
## C 异常
12+
13+
### C 异常
1314
- [ ] 异常
1415

15-
## D 泛型与容器
16+
### D 泛型与容器
1617
- [ ] 泛型
1718
- [ ] 列表和队列
1819
- [ ] Map和Set
1920
- [ ] 堆和优先队列
2021
- [ ] 通用容器类
2122

22-
## E 并发
23+
### E 并发
2324
- [ ] 并发包
2425
- [ ] 并发容器
2526
- [ ] 异步任务
2627
- [ ] 同步与协作
2728

28-
## F 动态与函数式编程
29+
### F 动态与函数式编程
2930
- [ ] 反射
3031
- [ ] 注解
3132
- [ ] 动态代理
3233
- [ ] 类加载机制
33-
- [ ] 函数式编程
34+
- [ ] 函数式编程
35+
36+
### G JVM系列
37+
- [x] JVM内存溢出问题示例代码
38+
39+
## 项目说明
40+
lib目录为引用的外部jar包所在的目录,将本项目导入idea后可以直接在lib目录上右键->Add as Library。
41+

src/GJVM/DirectMemoryOOM.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package GJVM;
2+
3+
import sun.misc.Unsafe;
4+
5+
import java.lang.reflect.Field;
6+
7+
/**
8+
* VM Args:-Xmx20M -XX:MaxDirectMemorySize=10M
9+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
10+
*/
11+
public class DirectMemoryOOM {
12+
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+
while (true) {
20+
unsafe.allocateMemory(_1MB);
21+
}
22+
}
23+
}

src/GJVM/HeapOOMDemo.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package GJVM;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* VM args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
8+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
9+
*/
10+
public class HeapOOMDemo {
11+
static class OOMObject{
12+
13+
}
14+
public static void main(String[] args) {
15+
List<OOMObject> list=new ArrayList<OOMObject>();
16+
while(true){
17+
list.add(new OOMObject());
18+
}
19+
}
20+
}

src/GJVM/JavaMethodAreaOOM.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package GJVM;
2+
3+
import net.sf.cglib.proxy.Enhancer;
4+
import net.sf.cglib.proxy.MethodInterceptor;
5+
import net.sf.cglib.proxy.MethodProxy;
6+
7+
import java.lang.reflect.Method;
8+
9+
/**
10+
* VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
11+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
12+
*/
13+
public class JavaMethodAreaOOM {
14+
15+
public static void main(String[] args) {
16+
while (true) {
17+
Enhancer enhancer = new Enhancer();
18+
enhancer.setSuperclass(OOMObject.class);
19+
enhancer.setUseCache(false);
20+
enhancer.setCallback(new MethodInterceptor() {
21+
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
22+
return proxy.invokeSuper(obj, args);
23+
}
24+
});
25+
enhancer.create();
26+
}
27+
}
28+
29+
static class OOMObject {
30+
}
31+
}

src/GJVM/JavaVMStackOOM.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package GJVM;
2+
3+
/**
4+
* VM Args:-Xss2M (这时候不妨设大些,请在32位系统下运行)
5+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
6+
*/
7+
public class JavaVMStackOOM {
8+
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) throws Throwable {
27+
JavaVMStackOOM oom = new JavaVMStackOOM();
28+
oom.stackLeakByThread();
29+
}
30+
}

src/GJVM/JavaVMStackSOF_1.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package GJVM;
2+
3+
/**
4+
* VM Args:-Xss128k
5+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
6+
*/
7+
public class JavaVMStackSOF_1 {
8+
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_1 oom = new JavaVMStackSOF_1();
18+
try {
19+
oom.stackLeak();
20+
} catch (Throwable e) {
21+
System.out.println("stack length:" + oom.stackLength);
22+
throw e;
23+
}
24+
}
25+
}

src/GJVM/JavaVMStackSOF_2.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package GJVM;
2+
3+
/**
4+
* VM Args:-Xss128k
5+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
6+
*/
7+
public class JavaVMStackSOF_2 {
8+
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_2 oom = new JavaVMStackSOF_2();
18+
try {
19+
oom.stackLeak();
20+
} catch (Throwable e) {
21+
System.out.println("stack length:" + oom.stackLength);
22+
throw e;
23+
}
24+
}
25+
}

src/GJVM/JavaVMStackSOF_3.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package GJVM;
2+
3+
/**
4+
* VM: JDK 1.0.2, Sun Classic VM
5+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
6+
*/
7+
public class JavaVMStackSOF_3 {
8+
private static int stackLength = 0;
9+
10+
public static void test() {
11+
long unused1, unused2, unused3, unused4, unused5,
12+
unused6, unused7, unused8, unused9, unused10,
13+
unused11, unused12, unused13, unused14, unused15,
14+
unused16, unused17, unused18, unused19, unused20,
15+
unused21, unused22, unused23, unused24, unused25,
16+
unused26, unused27, unused28, unused29, unused30,
17+
unused31, unused32, unused33, unused34, unused35,
18+
unused36, unused37, unused38, unused39, unused40,
19+
unused41, unused42, unused43, unused44, unused45,
20+
unused46, unused47, unused48, unused49, unused50,
21+
unused51, unused52, unused53, unused54, unused55,
22+
unused56, unused57, unused58, unused59, unused60,
23+
unused61, unused62, unused63, unused64, unused65,
24+
unused66, unused67, unused68, unused69, unused70,
25+
unused71, unused72, unused73, unused74, unused75,
26+
unused76, unused77, unused78, unused79, unused80,
27+
unused81, unused82, unused83, unused84, unused85,
28+
unused86, unused87, unused88, unused89, unused90,
29+
unused91, unused92, unused93, unused94, unused95,
30+
unused96, unused97, unused98, unused99, unused100;
31+
32+
stackLength ++;
33+
test();
34+
35+
unused1 = unused2 = unused3 = unused4 = unused5 =
36+
unused6 = unused7 = unused8 = unused9 = unused10 =
37+
unused11 = unused12 = unused13 = unused14 = unused15 =
38+
unused16 = unused17 = unused18 = unused19 = unused20 =
39+
unused21 = unused22 = unused23 = unused24 = unused25 =
40+
unused26 = unused27 = unused28 = unused29 = unused30 =
41+
unused31 = unused32 = unused33 = unused34 = unused35 =
42+
unused36 = unused37 = unused38 = unused39 = unused40 =
43+
unused41 = unused42 = unused43 = unused44 = unused45 =
44+
unused46 = unused47 = unused48 = unused49 = unused50 =
45+
unused51 = unused52 = unused53 = unused54 = unused55 =
46+
unused56 = unused57 = unused58 = unused59 = unused60 =
47+
unused61 = unused62 = unused63 = unused64 = unused65 =
48+
unused66 = unused67 = unused68 = unused69 = unused70 =
49+
unused71 = unused72 = unused73 = unused74 = unused75 =
50+
unused76 = unused77 = unused78 = unused79 = unused80 =
51+
unused81 = unused82 = unused83 = unused84 = unused85 =
52+
unused86 = unused87 = unused88 = unused89 = unused90 =
53+
unused91 = unused92 = unused93 = unused94 = unused95 =
54+
unused96 = unused97 = unused98 = unused99 = unused100 = 0;
55+
}
56+
57+
public static void main(String[] args) {
58+
try {
59+
test();
60+
}catch (Error e){
61+
System.out.println("stack length:" + stackLength);
62+
throw e;
63+
}
64+
}
65+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package GJVM;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
/**
7+
* VM Args:-XX:PermSize=6M -XX:MaxPermSize=6M
8+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
9+
*/
10+
public class RuntimeConstantPoolOOM_1 {
11+
12+
public static void main(String[] args) {
13+
// 使用Set保持着常量池引用,避免Full GC回收常量池行为
14+
Set<String> set = new HashSet<String>();
15+
// 在short范围内足以让6MB的PermSize产生OOM了
16+
short i = 0;
17+
while (true) {
18+
set.add(String.valueOf(i++).intern());
19+
}
20+
}
21+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package GJVM;
2+
3+
/**
4+
* @author zzm 来自周志明老师的《深入理解Java虚拟机》一书
5+
*/
6+
public class RuntimeConstantPoolOOM_2 {
7+
8+
public static void main(String[] args) {
9+
String str1 = new StringBuilder("计算机").append("软件").toString();
10+
System.out.println(str1.intern() == str1);
11+
12+
String str2 = new StringBuilder("ja").append("va").toString();
13+
System.out.println(str2.intern() == str2);
14+
}
15+
}

0 commit comments

Comments
 (0)