1.1 多对一:不需要切换,线程创建、调度、同步非常快;但是如果其中一个用户线程阻塞会造成其他线程无法执行,且无法像内核线程一样实现较完整的调度、优先级;
1.2 一对一:java的jvm几乎把所有对线程的操作都交给了系统内核操作,线程真正启动顺序不一定是按我们启动的顺序,会引起用户态和内核态的频繁切换;如果系统出现大量线程,回家降低系统性能。
1.1 栈溢出
1.2 堆溢出
》
》第8行设置会在堆溢出会导出Damping日志
1.3 方法区溢出
1.4 本机直接内存溢出
1.1 不使用的内存,却没有被释放;
1.2 每一次请求进来或者每一次操作处理都分配了内存,却有部分不能回收(或未释放),随着请求越来越多,内存泄漏就会越来越严重,必然造成内存溢出。
1.3 内存泄漏一般是资源管理问题或者程序bug,内存溢出则是内存空间不足和内存泄漏的最终结果。
(1)这个星期天上午,衣物堆内存(堆内存)在很多需要使用算法机洗(GC算法)的衣服,而且因为衣服太多了,所以需要几台洗衣机并行机洗(GC并行线程数)。
(2)中午终于洗完衣服了衣服,觉得很有成就感,于是我写下了巨大的日志(GC日志)并保存在日志文件(GC日志文件)夹中。
(3)但是日志文件超过了原数据区域的最大值(元数据区的最大值),于是我压缩了单个日志形成文件占用大小(单个线程栈的大小),并设置之后如果内存溢出自动转存(堆内存溢出自动进行dump)云端。
1.空间整合:哪块垃圾最多优先清理
2.多线程+并发+可预测停顿
(1)先用jps列出进程,再用jstat打印状态,然后再使用jinfo查看信息,
(2)其次再用jmap堆转存快照,以及用jstack转存当前线程快照,最后用jhat查看堆内存快照。
(3)实战cpu飙升:
a.先用top后用shift+p找到占用CPU最高的进程,再用top -p 进程号后用H找到占用cpu最高的线程,
b.再执行jstack 线程号输出线程信息,同时根据线程号转成的16进制找到对应的堆信息,然后再找到对应的代码
安全点:方法调用、循环跳转、异常跳转;设置标志位,并不断轮询,主动停止。
先通过top命令找到cpu使用率高的线程;top -p 进程号;该界面输入H查找最高cpu的线程;执行jstack 进程号做dump输出线程信息; 同时根据线程的16进制找到对应的堆信息,然后再找出对应的代码
6、最后根据线程信息定位到具体代码
随心所往,看见未来。Follow your heart,see night!
欢迎点赞、关注、留言,一起学习、交流!