Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3711480

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /