昨天的排版并不是很满意,而且每天公众号只能发布一篇文章,近期资料看了很多,需要复习巩固一下,在群里,私聊小伙伴问了很多问题,今天都得到了解决。
[昨天好奇哈,就像试试countdownLatch容量改为Integer.MaxValue会不会崩。结果了,并不会,只是最大值为2147483647换算为秒大概66年,估计服务器会睡着]
JVM:Java Virtual Machine
什么是JMM?java memory model java内存模型
一提到JVM就不得不提JVM调优,GC垃圾回收
(一)GC垃圾回收
什么是垃圾?
垃圾:已经不再被内存使用到的空间
2.如何确定垃圾?
引用计数法,可达性分析算法
3.GC算法?
引用计数法/ 可达性分析算法
复制算法:新生区,浪费空间
标记清除:老年区,内存碎片
标记压缩:老年区,移动对象
(二)JVM的系统参数
标配参数
X参数
XX参数:Boolean类型 -表示是否开启,KV型
JVM 系统默认值
Xms Xmx 做好调成一致 避免GC频繁收集 忽高忽低
-XX: PrintGCDetails:开启打印GC细节
-XX: UseSerialGC:开启串行收集
-XX: PrintDFlagsInitial
jinfo -flag *** pid
-XX:MetaspaceSize:元空间大小
-Xss:单个线程大小跟随系统
Docs.oracle.com
4.强引用,软引用,弱引用,虚引用
(三)OOM :java.lang.outofmemoryError
java.lang.StackOverflowError
java.lang.outofmemoryError :java heap space
java.lang.outofmemoryError :GC overhead limit exceeded
java.lang.outofmemoryError :Direct buffer memory
java.lang.outofmemoryError:unable to create new native thread
java.lang.outofmemoryError Metaspace
demo:
package com.kk;/** * @author zhaokk * @create 2019-05-21-21:56 */
public class StackOverFlowDemo {
public static void main(String[] args) { stackOverFlow(); }
private static void stackOverFlow() {
stackOverFlow(); }
}
Exception in thread "main" java.lang.StackOverflowError at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14) at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14) at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14) at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14) at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14) at com.kk.StackOverFlowDemo.stackOverFlow(StackOverFlowDemo.java:14)
递归层次太深
垃圾回收器:
并发 串行 并发标记 G1 java12(ZGC)
1、多数的Java应用不需要在服务器上进行GC优化;
2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
3、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
4、减少创建对象的数量;
5、减少使用全局变量和大对象;
6、GC优化是到最后不得已才采用的手段;
7、在实际使用中,分析GC情况优化代码比优化GC参数要多得多
https://www.cnblogs.com/csniper/p/5592593.html
在不止一次问了如何配置之后终于自己操作后解决
---maven package
内部通过vm option配置
外部命令 java -server XX: printGCDetail -jar packagename