Java编程知识小结


1
2
3
arrList = new ArrayList<>(Array.asList())

arrList = Array.asList()

两者的区别是什么?

后者在执行arrList.add(1)时会报错。原因:Array.asList()只会返回固定大小的列表,不能进行添加删除操作(但是可以修改原数组的数据)。


ArrayList是1.5倍扩容

Vector是2倍扩容


Vector是线程安全的,每个方法都加了syn关键字,频繁加锁可能导致性能降低。


Map相关的特性:

  • HashMap——随机顺序迭代

  • LinkedHashMap——按插入顺序迭代

  • TreeMap——按键值的比较顺序迭代

JDK工具


  • 可以检查死锁的工具有哪些?
  • jconsole;jstack

  • 可以检查内存泄露的工具有哪些?
  • jmap;jhat

  • 排查CPU占满的原因,应该使用什么工具?
  • top -Hd pid可以找到最占用CPU的线程。然后通过jstack查找该线程所处的堆栈,确定问题发生的位置。

(其中-H是线程开关,使用-H可以获取所有的单独的线程信息。-d可以设置延时)


jconsole

  • 路径

该工具可以在jdk安装目录的bin下找到,如D:\Program Files\Java\jdk1.8.0_261\bin

  • 使用方法如下:

image-20221011174341998

jstack——查看JAVA进程的堆栈情况,可确认死锁、IO等待、死循环等问题

  • 用法
1
jstack.exe pid
  • 示例

image-20221011175504386

jmap——生成进程的内存堆快照

  • 用法
1
2
3
4
5
# 打印堆快照
jmap -dump:file=./dumpfile.dump pid

# 查看类的占用情况
jmap -histo:live pid
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
D:\Program Files\Java\jdk1.8.0_261\bin>jmap -dump:file=./dumpfile.dump 332
Dumping heap to D:\Program Files\Java\jdk1.8.0_261\bin\dumpfile.dump ...
Heap dump file created

D:\Program Files\Java\jdk1.8.0_261\bin>jmap -histo:live 332

num #instances #bytes class name
----------------------------------------------
1: 4019 6387176 [I
2: 30375 2106904 [C
3: 29579 709896 java.lang.String
4: 4318 490496 java.lang.Class
5: 571 347416 [B
6: 10083 322656 java.util.HashMap$Node
7: 5806 293440 [Ljava.lang.Object;
8: 2825 248600 java.lang.reflect.Method
9: 504 214856 [J
10: 8865 212760 sun.font.TrueTypeFont$DirectoryEntry

jhat——解析jmap生成的快照

  • 用法
1
2
# -J<flag>表示将<flag>传递给运行时系统;-Xmx表示最大堆
jhat -J-Xmx515M dumpfile.dump
  • 示例
1
2
3
4
5
6
7
8
9
10
D:\Program Files\Java\jdk1.8.0_261\bin>jhat -J-Xmx515M dumpfile.dump
Reading from dumpfile.dump...
Dump file created Tue Oct 11 18:09:23 CST 2022
Snapshot read, resolving...
Resolving 426791 objects...
Chasing references, expect 85 dots.....................................................................................
Eliminating duplicate references.....................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

访问http://localhost:7000/,有

image-20221011181448971

拓展

jstat——查看进程中内存使用情况

  • 用法
1
2
3
4
5
6
7
8
# 统计加载了多少类,占用了多少空间
jstat -class pid

# 统计编译了多少文件
jstat -compiler pid

# 每隔2秒,打印一次对应进程的内存使用信息
jstat -gcutil pid 2000
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:\Program Files\Java\jdk1.8.0_261\bin>jstat -class 332
Loaded Bytes Unloaded Bytes Time
3931 8079.8 0 0.0 1.54

D:\Program Files\Java\jdk1.8.0_261\bin>jstat -compiler 332
Compiled Failed Invalid Time FailedType FailedMethod
4139 1 0 10.13 1 sun/font/TrueTypeFont initAllNames

D:\Program Files\Java\jdk1.8.0_261\bin>jstat -gcutil 332 2000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 23.65 86.87 60.52 96.91 93.81 11 0.044 2 0.100 0.144
0.00 23.65 86.87 60.52 96.91 93.81 11 0.044 2 0.100 0.144
33.10 0.00 1.93 60.56 96.97 94.13 12 0.048 2 0.100 0.148
33.10 0.00 1.97 60.56 96.97 94.13 12 0.048 2 0.100 0.148
33.10 0.00 13.87 60.56 96.97 94.13 12 0.048 2 0.100 0.148
33.10 0.00 13.87 60.56 96.97 94.13 12 0.048 2 0.100 0.148

注意:如果E和O也即新生代和老年代内存区一直是满的,则很有可能引发OMM风险(内存溢出)。

jdb——对core文件和正在运行的JAVA进程进行实时调试,类似gdb

  • 用法
1

Java编译优化



----------- 本文结束 -----------




0%