1 | arrList = new ArrayList<>(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
- 使用方法如下:
jstack——查看JAVA进程的堆栈情况,可确认死锁、IO等待、死循环等问题
- 用法
1 | jstack.exe pid |
- 示例
jmap——生成进程的内存堆快照
- 用法
1 | # 打印堆快照 |
- 示例
1 | D:\Program Files\Java\jdk1.8.0_261\bin>jmap -dump:file=./dumpfile.dump 332 |
jhat——解析jmap生成的快照
- 用法
1 | # -J<flag>表示将<flag>传递给运行时系统;-Xmx表示最大堆 |
- 示例
1 | D:\Program Files\Java\jdk1.8.0_261\bin>jhat -J-Xmx515M dumpfile.dump |
拓展
jstat——查看进程中内存使用情况
- 用法
1 | # 统计加载了多少类,占用了多少空间 |
- 示例
1 | D:\Program Files\Java\jdk1.8.0_261\bin>jstat -class 332 |
注意:如果E和O也即新生代和老年代内存区一直是满的,则很有可能引发OMM风险(内存溢出)。
jdb——对core文件和正在运行的JAVA进程进行实时调试,类似gdb
- 用法
1 |


