字符串拼接:
在编译期,javac会自动生成一个StringBuilder
-XX: +-OptimizeStringConcat
int version = 9;
String str = "I love" + " Java " + version + " high performance";
StringBuilder sb = new StringBuilder("I love Java ");
sb.append(version);
sb.append(" high performance");
String str = sb.toString();
Java堆与栈的对比
- 栈的访问速度比堆快
- 栈中一般只存放局部变量,即基本类型和对象引用(对象在堆中)
- 栈是LIFO的,堆不是
- 栈的内存很小,且是线程私有,堆是共有的
- 方法调用完成后栈内存会释放,堆内存的释放取决于GC
- 栈内存溢出会抛出StackOverFlowError,堆内存溢出会抛出OutOfMemoryError
逃逸分析
添加-XX:+DoEscapeAnalysis可以打开逃逸分析,对于引用不溢出的对象可以使用栈上分配,从而减小GC而提高性能。
OutOfMemoryError的产生原因
- Java heap space:堆空间不够给对象分配内存
- GC overhead limit exceed:频繁GC,但GC几乎没有作用
- -XX: -UseGCOverheadLimit 可以去除这个检测
- Permgen space:Class过多,常量池过大,JIT编译优化过多,限于JVM7以前,Java8以后就没有永久代了
- Metaspace:用上,Java8后永久代变成元数据区
- Unable tp create new native thread
- request size bytes for reason: 交换区空间耗尽
- Requested array size exceeds VM limit
- kill process or sacrifice child
数据库可能的问题
- SQL语句写得不好
- 联结过多
- 没有负载均衡
- 没有建立索引或用到合适的索引
- 表的设计不好
- 写了N+1次的查询,但实际可以合并为一个
网络操作
- java.httpclient
- 新增了HttpRequest,支持HTTP/2
- 新增了WebSocket客户端
日志
有FATAL,ERROR,WARNING,INFO,DEBUG,TRACE这几个等级
private final static Logger logger =
Logger.getLogger(MyLogger.class.getName());
线程堆分析
- jmap -dump:dump=headdump.hdprof,format=b [pid]
- -XX:+HeapDumpOnOutOfMemoryError
- OSQL: SELECT * FROM java.io.File x
GC简介
优点
- 自动内存管理
- 解决野指针什么的问题
- 减少bug的出现
- 减少内存泄露
- 对大数据结构有更好的实现
- 提高软件安全和效率
缺点
- GC方法需要占用更多的资源
- GC进程影响Java程序的性能
- GC会需要更多的内存占用
G1收集器
适合于大于4G的大堆,每个区域可达到32MB
StackWalker
集合工厂方法
- List.of();
- Set.of();
- Map.of();
CompletableFuture
ExecutorService pool = Executors.newCachedThreadPool();
CompletableFuture<SomeClass> cf =
CompletableFuture.supplyAsync(() -> getData(), pool)
.thenApplyAsync(result -> doSth(result), pool)
.handleAsync((res, ex) -> myHandler(res,ex), pool)