Skip to content

Commit 3711480

Browse files
committed
Merge pull request giantray#1 from giantray/master
update from origin
2 parents 5d872de + 6c3adf5 commit 3711480

File tree

33 files changed

+546
-43
lines changed

33 files changed

+546
-43
lines changed

README.md

Lines changed: 29 additions & 26 deletions
Large diffs are not rendered by default.

contents/avoiding-null-statements-in-java.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ public interface Parser {
5050

5151
我们来改造一下
5252

53-
类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象
53+
类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象:
54+
```java
5455
public class MyParser implements Parser {
5556
private static Action DO_NOTHING = new Action() {
5657
public void doSomething() { /* do nothing */ }
@@ -62,7 +63,7 @@ public class MyParser implements Parser {
6263
return DO_NOTHING;
6364
}
6465
}}
65-
66+
```
6667

6768
对比下面两份调用实例
6869
1. 冗余: 每获取一个对象,就判一次空
@@ -74,7 +75,8 @@ if (parser == null) {
7475
}
7576
Action action = parser.findAction(someInput);
7677
if (action == null) {
77-
// do nothing} else {
78+
// do nothing}
79+
else {
7880
action.doSomething();}
7981
```
8082

@@ -90,11 +92,11 @@ ParserFactory.getParser().findAction(someInput).doSomething();
9092
- 如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>))
9193
例如:
9294
使用
93-
"bar".equals(foo)
95+
`"bar".equals(foo) `
9496
而不是
95-
foo.equals("bar")
97+
`foo.equals("bar") `
9698
- Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空。不过代码量还是不少。不爽。
97-
- 如果你想返回null,请挺下来想一想,这个地方是否更应该抛出一个异常
99+
- 如果你想返回null请停下来想一想,这个地方是否更应该抛出一个异常
98100

99101
stackoverflow链接:
100-
http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java?page=2&tab=votes#tab-top
102+
http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java?page=2&tab=votes#tab-top

contents/breaking-out-of-nested-loops-in-java.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ for (Type type : types) {
1414

1515
###回答
1616

17-
可以用brea+label的语法,例子如下
17+
可以用break+label的语法,例子如下
1818
```java
1919
public class Test {
2020
public static void main(String[] args) {
@@ -36,4 +36,4 @@ public class Test {
3636
首先在for循环前加标签,如例子中的outerloop,然后在for循环内break label(如本例的outerloop),就会跳出该label指定的for循环。
3737

3838
stackoverflow链接:
39-
http://stackoverflow.com/questions/886955/breaking-out-of-nested-loops-in-java
39+
http://stackoverflow.com/questions/886955/breaking-out-of-nested-loops-in-java
File renamed without changes.
File renamed without changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 如何使用Java创建一个内存泄漏的程序
2+
3+
## 问题:
4+
我在一个面试的过程中被问到如何使用Java创建一个内存泄漏的程序。毫无疑问地说,我当时哑口无言,根本不知道如何开始编码。
5+
6+
## 解答
7+
在Java下有一个很好的方法来创建内存泄漏程序--通过使得对象不可访问但任然存储在内存中。
8+
9+
1. 应用程序创建一个长期运行的线程A 或者 使用一个线程池来加快泄漏的速度。
10+
11+
2. 线程A使用ClassLoader(用户可以自定义)加载一个类 B。
12+
13+
3. 在类B申请一块很大的连续内存(例如:new byte[1000000]),
14+
并使用一个静态成员变量保存该空间的一个强引用,之后在一个ThreadLocal对象中存储类B对象的引用。
15+
虽然泄漏这个类的一个实例就足够了,但是也可以通过申请多个实例的方法来加快内存泄漏的速度。
16+
17+
4. 线程A清理所有指向自定义类或者通过ClassLoadeer加载的引用。
18+
19+
5. 重复上述步骤
20+
21+
上述方式可以达到内存泄漏的目的,因为 ThreadLocal 存储了一个指向类B对象的引用,
22+
而该对象又保存了一个指向其类的引用,这个类又保存了一个指向其ClassLoader的引用,
23+
而ClassLoader又保存了一个通过它加载的所有类的引用。
24+
这种方法在许多的JVM的实现中表现更糟糕,因为Classes和ClassLoader被直接存储在老年代(permgen)并且永远都不会被GC处理。
25+
26+
******************************下方为个人理解************************************
27+
28+
通过一个简单的图来描述上述关系:<br>
29+
ThreadLocal.obj ---> B.obj ---> B.class <--> ClassLoader.obj<br>
30+
注:上图的\*.obj表示\*类的一个实例对象,B.class表示类B的Class对象
31+
32+
******************************上方为个人理解************************************
33+
34+
这个模式的一个变形:如果频繁的重新部署那些可能使用ThreadLocals的应用,应用容器(例如Tomcat)就会像筛子一样泄漏内存。
35+
因为应用容器使用上述所说的线程,每次重新部署应用时,应用容器都会使用一个新的ClassLoader。
36+
37+
具体代码可以参考:https://gist.github.com/dpryden/b2bb29ee2d146901b4ae
38+
39+
参考:http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html
40+
41+
stackoverflow原址:http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
##如何处理 java.lang.outOfMemoryError PermGen space error
2+
3+
###问题
4+
5+
最近,我在过运行我的web应用时得到:java.lang.OutOfMemoryError: PermGen space。
6+
我的应用是一个典型的 Hibernate/JPA + IceFaces/JSF的应用.运行于Tomcat6.0和jdk1.6.我发布了多次以后,产生了这个错误。
7+
8+
是什么原因造成的,我如何避免?我怎样修复?
9+
10+
11+
#回答
12+
13+
14+
解决的方案是当TomeCat启时,在jvm的的命令行添加参数
15+
16+
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
17+
18+
19+
你也可以停止tomcat的服务,直接进入Tomcat/bin目录,运行tomcat6w.exe.在Java的标签下,加好上面的参数。单击"OK",重新启动Tomcat的服务.
20+
21+
22+
如果系统返回错误,提示指定的服务不存在,你可以运行:
23+
24+
tomcat6w //ES//servicename
25+
26+
servicename的名字你可以在services.msc中查看。
27+
28+
stackoverflow链接:
29+
http://stackoverflow.com/questions/88235/dealing-with-java-lang-outofmemoryerror-permgen-space-error
30+
31+

contents/Declare-array-in-Java.md renamed to contents/declare-array-in-java.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ int[] myIntArray = new int[]{1, 2, 3};
1717
```
1818
String[] myStringArray = new String[3];
1919
String[] myStringArray = {"a", "b","c"};
20-
String[] myStringArray = new String[]("a", "b", "c");
20+
String[] myStringArray = new String[]{"a", "b", "c"};
2121
```
2222
[stackoverflow链接:Declare array in Java?](http://stackoverflow.com/questions/1200621/declare-array-in-java)
2323

File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)