0%

in

image-20200801100108682

image-20200801100128803

stars/forks

image-20200801100534553

image-20200801100905604

image-20200801100931209

awesome

image-20200801101332176

#L

image-20200801101744265

T

image-20200801101930734

搜索某个区域的大佬

image-20200801102237942

top

image-20200730163430893

load average 一分钟,五分钟,十五分钟

相加/3*100%大于60%说明负载重

uptime是top的精简命令

vmstat

image-20200730163907598

image-20200730164001868

image-20200730164348739

free

image-20200730164611084

iostat

image-20200801091922864

image-20200801092033225

image-20200801092157777

优化

image-20200801092947675

四种常用的垃圾收集器

image-20200728084342370

image-20200728085117331

image-20200728085228593

四大垃圾回收算法

引用计数

复制拷贝

标记清楚

标记整理

image-20200728090031111

image-20200728090301756

java -XX:+PrintCommandLineFlags -version

查看默认的垃圾回收器

java回收类型

image-20200728090806881

image-20200728091306523

image-20200728091507852

image-20200728093051291

串行收集器

image-20200728093431022

image-20200728093711911

并行收集器

ParNew

image-20200728094735068

image-20200728095654831

image-20200728095736689

Parallel Scavenge

image-20200728100120388

image-20200728100412433

image-20200728100523090

Parallel Old

image-20200728101054538

CMS

image-20200728101347634

image-20200728101550783

image-20200728101701852

image-20200728101917075

image-20200728102049230

image-20200728102148153

image-20200728102435826

Serial Old

image-20200728102606552

image-20200728161318460

G1

image-20200728162125552

image-20200728162659910

image-20200728163541317

image-20200730160314790

image-20200730160507472

image-20200730160704212

在springboot的具体调优

image-20200730161837029

image-20200730161531357

image-20200730162011123

image-20200727151343863

StackOverFlowError

1
2
3
4
5
6
7
8
9
10
public class StackOverFlowErrorDemo {

public static void main(String[] args) {
dfs();//Exception in thread "main" java.lang.StackOverflowError
}

public static void dfs(){
dfs();
}
}

最常见在递归中无返回条件一直调用。

JavaHeapSpace

1
2
3
4
5
6
7
8
9
10
11
public class JavaHeapSpaceDemo {

public static void main(String[] args) {
String str="wqoierihfsdkfsdf";

while (true){
str+=new Random().nextInt(108432432)+new Random().nextInt(238923293);
str.intern();
}
}
}

image-20200727152702974

GC Overhead Limited Exceeded

image-20200727153202737

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=3m
* @author xixing
* @version 1.0
* @date 2020/7/27 15:33
*/
public class GCOverheadDemo {

public static void main(String[] args) {
int i=0;

List<String> list=new ArrayList<>();

try {
while (true){
list.add(String.valueOf(i++).intern());
}
}catch (Throwable e){

System.out.println("********************");
System.out.println(i);
e.printStackTrace();

}
}
}

DirectBufferMemory

image-20200727155332807

image-20200727155352610

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @author xixing
* @version 1.0
* @date 2020/7/27 15:49
*/
public class DirectBufferMemoryDemo {
public static void main(String[] args) {


System.out.println("配置的本地内存maxDirectMemory:"+sun.misc.VM.maxDirectMemory()/(double)1024/1024+"MB");
Buffer bb= ByteBuffer.allocateDirect(10*1024*1024);
}
}

Unable to create new native thread

image-20200727160305811

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @author xixing
* @version 1.0
* @date 2020/7/27 16:08
*/
public class UnableCreateNewThreadDemo {
public static void main(String[] args) {

for (int i = 0; ; i++) {
System.out.println("****************"+i);
new Thread(()->{
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}

}
}

调整最大线程数

ulimit -u 查看可以创建的最大线程

vim /etc/security/limits.d/90-nproc.conf

Metaspace

image-20200727162251944

image-20200727162956731

强引用

image-20200726150541800

1
2
3
4
5
6
7
public static void main(String[] args) {
Object obj1=new Object();
Object obj2=obj1;
obj1=null;
System.gc();
System.out.println(obj2);
}

软引用

image-20200726152650937

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class SoftReferenceDemo {

/**
* 内存够用就不回收,内存不够就回收
*/
public static void softRefMemoryEnough(){
Object o1=new Object();
SoftReference<Object> softReference=new SoftReference<Object>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1=null;
System.gc();
System.out.println(o1);
System.out.println(softReference.get());

}

/**
* 故意产生oom,new一个大内存数组,设置堆内存大小小一点
* -Xms5m -Xmx5m
*/
public static void softRefMemoryNotEnough(){
Object o1=new Object();
SoftReference<Object> softReference=new SoftReference<Object>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1=null;

try {
byte[] bytes=new byte[30*1024*1024];
}catch (Exception e) {
e.printStackTrace();
}finally
{
System.out.println(o1);
System.out.println(softReference.get());
}

}

public static void main(String[] args) {
//softRefMemoryEnough();
softRefMemoryNotEnough();
}
}

弱引用

image-20200726153240887

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class WeekReferenceDemo {

public static void main(String[] args) {
Object o1=new Object();
WeakReference<Object> weakReference=new WeakReference<>(o1);
System.out.println(o1);
System.out.println(weakReference.get());
System.out.println("==================");
o1=null;
System.gc();
System.out.println(o1);
System.out.println(weakReference.get());
}
}

软引用和弱引用英语场景

image-20200726153702788

WeakHashMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class WeakHashMapDemo {

public static void main(String[] args) {
myHashMap();
System.out.println("==============================");
myWeakHashMap();
}



private static void myHashMap() {
Map<Integer,String> hashMap=new HashMap<>();
Integer a=new Integer(1);
hashMap.put(a,"HashMap");
System.out.println(hashMap);

a=null;
System.gc();
System.out.println(hashMap);
System.out.println(hashMap);

}

private static void myWeakHashMap() {
Map<Integer,String> hashMap=new WeakHashMap<>();
Integer a=new Integer(1);
hashMap.put(a,"HashMap");
System.out.println(hashMap);

a=null;
System.out.println(hashMap);
System.gc();
System.out.println(hashMap);

}
}

image-20200726155639718

虚引用

image-20200726155743858

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PhantomReferenceDemo {

public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
ReferenceQueue<Object> referenceQueue=new ReferenceQueue<>();
PhantomReference<Object> phantomReference=new PhantomReference<>(o1,referenceQueue);

System.out.println(o1);
System.out.println(phantomReference.get());
System.out.println(referenceQueue.poll());

System.out.println("====================");
o1=null;
System.gc();
Thread.sleep(500);

System.out.println(o1);
System.out.println(phantomReference.get());
System.out.println(referenceQueue.poll());
}
}

引用队列

image-20200726161111815

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ReferenceQueueDemo {
public static void main(String[] args) throws InterruptedException {
Object o1=new Object();
ReferenceQueue<Object> referenceQueue=new ReferenceQueue<>();
WeakReference<Object> weakReference=new WeakReference<>(o1,referenceQueue);

System.out.println(o1);
System.out.println(weakReference.get());
System.out.println(referenceQueue.poll());

System.out.println("====================");
o1=null;
System.gc();
Thread.sleep(500);

System.out.println(o1);
System.out.println(weakReference.get());
System.out.println(referenceQueue.poll());

}
}

总结

image-20200726161334988