字符串拼接:
在编译期,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)