Java各类技能知识点学习链接大全:三、JVM相关

以下内容大多是学习链接,他人整理,个人收藏以便复习,同时归纳分享出来(如有不妥,原作者可随时联系本人删除,感谢!)

三、JVM相关

1、使用 VisualVM 进行性能分析及调优

IBM Developer

2、JDK8中JVM堆内存划分

JDK8中JVM堆内存划分 - jtlgb - 博客园

3、Jvm调优系列
JVM调优总结 - Andrew.Zhou - 博客园

4、如何在CMS和G1之间选择垃圾回收器:

JVM原理之GC垃圾回收器CMS详解 - 掘金

https://www.jianshu.com/p/b92b08706a12

5、堆中年轻代、老年代区分

JVM----新生代,老年代,永久代 - MyBeans - 博客园

6、阿里JVM专家——  寒泉子博客

你假笨

阿里云开发者社区-云计算社区-阿里云

7、Java中的NIO为什么用直接内存,而不用堆heap内存

Java-直接内存 DirectMemory 详解 - 腾讯云开发者社区-腾讯云

Java IO 学习(六)Java的Direct Memory与IO - stevenczp - 博客园

https://www.cnblogs.com/yanl55555/p/13334667.html

8、Java中9种常见的CMS GC问题分析与解决 (美团技术博客)

Java中9种常见的CMS GC问题分析与解决 - 美团技术团队

9、Jvm 启动常见参数 :

JVM(Java虚拟机)优化大全和案例实战_AlexanderHu的博客-CSDN博客

10、从实际案例聊聊Java应用的GC优化(美团技术博客)

https://tech.meituan.com/2017/12/29/jvm-optimize.html

11、JVM系列详解:

(1)Java虚拟机详解(一)------简介

Java虚拟机详解(一)------简介 - YSOcean - 博客园

(2)Java虚拟机详解(二)------运行时内存结构

Java虚拟机详解(二)------运行时内存结构 - YSOcean - 博客园

(3)Java虚拟机详解(三)------垃圾回收

Java虚拟机详解(三)------垃圾回收 - YSOcean - 博客园

(4)Java虚拟机详解(四)------垃圾收集器

Java虚拟机详解(四)------垃圾收集器 - YSOcean - 博客园

(5)Java虚拟机详解(五)------JVM参数(持续更新)

Java虚拟机详解(五)------JVM参数(持续更新) - YSOcean - 博客园

(6)Java虚拟机详解(六)------内存分配

Java虚拟机详解(六)------内存分配 - YSOcean - 博客园

(7)Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行 - YSOcean - 博客园

(8)Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化

Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化 - YSOcean - 博客园

12、Java8内存模型—永久代(PermGen)和元空间(Metaspace)

Java8内存模型—永久代(PermGen)和元空间(Metaspace) - liuxiaopeng - 博客园

https://www.jianshu.com/p/92a5fbb33764

https://www.jianshu.com/p/a6f19189ec62

https://www.jianshu.com/p/1a0b4bf8d498

13、深入理解垃圾收集器和收集器的选择策略

JVM调优思路(CMS 和 G1对比)_小哥骑单车的博客-CSDN博客

深入理解垃圾收集器和收集器的选择策略_KilluaZoldyck的博客-CSDN博客

(对于吞吐量优先的场景,就只有一种选择,就是使用 PS 组合(Parallel Scavenge+Parallel Old )。
对于响应时间优先的场景,在 JDK1.8 的话优先 G1,其次是 CMS 垃圾回收器,另外还有PN、ZGC、Shenandoah。)

14、jvm垃圾回收器(串行、吞吐量优先、响应时间优先、G1)

jvm垃圾回收器(串行、吞吐量优先、响应时间优先、G1) - 怀梦想,致远方 - 博客园

15、JVM的永久代中会发生垃圾回收吗? 参考《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

有些人认为方法区(如HotSpot虚拟机中的元空间或者永久代)是没有垃圾收集行为的,《Java虚
拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整
实现方法区类型卸载的收集器存在(如JDK 11时期的ZGC收集器就不支持类卸载),方法区垃圾收集
的“性价比”通常也是比较低的:在Java堆中,尤其是在新生代中,对常规应用进行一次垃圾收集通常
可以回收70%至99%的内存空间,相比之下,方法区回收囿于苛刻的判定条件,其区域垃圾收集的回
收成果往往远低于此。
方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类型。回收废弃常量与回收
Java堆中的对象非常类似。举个常量池中字面量回收的例子,假如一个字符串“java”曾经进入常量池
中,但是当前系统又没有任何一个字符串对象的值是“java”,换句话说,已经没有任何字符串对象引用
常量池中的“java”常量,且虚拟机中也没有其他地方引用这个字面量。如果在这时发生内存回收,而且
垃圾收集器判断确有必要的话,这个“java”常量就将会被系统清理出常量池。常量池中其他类(接
口)、方法、字段的符号引用也与此类似。
判定一个常量是否“废弃”还是相对简单,而要判定一个类型是否属于“不再被使用的类”的条件就
比较苛刻了。需要同时满足下面三个条件:
·该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例。
·加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如
OSGi、JSP的重加载等,否则通常是很难达成的。
·该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方
法。
Java虚拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是
和对象一样,没有引用了就必然会回收。关于是否要对类型进行回收,HotSpot虚拟机提供了Xnoclassgc参数进行控制,
还可以使用-verbose:class以及-XX:+TraceClass-Loading、-XX:
+TraceClassUnLoading查看类加载和卸载信息,其中-verbose:class和-XX:+TraceClassLoading可以在
Product版的虚拟机中使用,-XX:+TraceClassUnLoading参数需要FastDebug版[1]的虚拟机支持。
在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载
器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压
力。
 

16、JVM监控命令:jps jstat jmap jhat jstack jinfo,可视化监控工具:jvisualvm、jconsole介绍:

jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo) - 纯洁的微笑 - 博客园

java - JVM监控命令详解_个人文章 - SegmentFault 思否

17、G1收集器

G1 收集器原理理解与分析 - 知乎

https://www.jianshu.com/p/0f1f5adffdc1

18、新一代垃圾回收器ZGC的探索与实践(基于JDK版本11)

新一代垃圾回收器ZGC的探索与实践_美团技术团队的博客-CSDN博客 (美团技术博客)

19、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法_gaoyong_stone的博客-CSDN博客_heap区

20、阿里面试100%问到,JVM性能调优篇

https://www.toutiao.com/a6683710658250277380/

阿里面试100%问到,JVM性能调优篇_网易订阅(同上)

21、GC Roots 是什么?哪些对象可以作为 GC Root?看完秒懂!

GC Roots 是什么?哪些对象可以作为 GC Root?看完秒懂!_一直Tom猫的博客-CSDN博客_哪些对象可以作为gcroots

22、从CMS到G1:LinkedIn个人主页调优实战

https://www.jianshu.com/p/db2cd9ad699a (中文)

Tuning Espresso’s JVM Performance | LinkedIn Engineering(英文)

23、使用CMS垃圾收集器产生的问题和解决方案(CMS调优)

如果我们看年轻代的内存使用率处在高位,导致频繁的 Minor GC,而频繁 GC 的效率又不高,说明对象没那么快能被回收,这时年轻代可以适当调大一点。

如果我们看年老代的内存使用率处在高位,导致频繁的 Full GC,这样分两种情况:如果每次 Full GC 后年老代的内存占用率没有下来,可以怀疑是内存泄漏;如果 Full GC 后年老代的内存占用率下来了,说明不是内存泄漏,我们要考虑调大年老代。

使用CMS垃圾收集器产生的问题和解决方案 - God is a Coder.. - OSCHINA - 中文开源技术交流社区

24、CMS并发收集器:

来自于《深入理解Java虚拟机》

 

 25、G1收集器:

来自于《深入理解Java虚拟机》

 

26、收集器对比

来自于《深入理解Java虚拟机》

 

27、栈帧(Stack Frame)

https://www.jianshu.com/p/b666213cdd8a

28、JVM为什么用栈帧来这种数据结构:

  • 函数的返回地址和参数
  • 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
  • 函数调用的上下文

简单来说,栈是一种LIFO形式的数据结构,所有的数据都是后进先出。这种形式的数据结构正好满足我们调用函数的方式:父函数调用子函数,父函数在前,子函数在后;返回时,子函数先返回,父函数后返回。栈支持两种基本操作,push和pop。push将数据压入栈中,pop将栈中的数据弹出并存储到指定寄存器或者内存中。
https://www.jianshu.com/p/e7a22923867f

29、Java双亲委派模型:

双亲委派保证类加载器,自下而上的委派,又自上而下的加载,保证每一个类在各个类加载器中都是同一个类。

双亲委派模式的优点_葫芦娃你好我是皮卡丘的博客-CSDN博客_双亲委派机制好处

Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里?_徐同学呀的博客-CSDN博客_为什么破坏双亲委派模型1. 双亲委派就是类加载器之间的层级关系,加载类的过程是一个递归调用的过程,首先一层一层向上委托父类加载器加载,直到到达最顶层启动类加载器,启动类加载器无法加载时,再一层一层向下委托给子类加载器加载。2. 双亲委派的目的主要是为了保证`java`官方的类库`\lib`和扩展类库`\lib\ext`的加载安全性,不会被开发者覆盖。...https://blog.csdn.net/weixin_36586120/article/details/117457014

30、经典jvm参数

轻松永远记住经典jvm参数 - 知乎

31、Java基本类型变量的内存分配在栈还是堆

Java基本类型的内存分配在栈还是堆 - 知乎

Java基本类型的内存分配在栈还是堆(同上)

32、G1垃圾优先型垃圾回收器调优

Garbage First Garbage Collector Tuning

33、CMS配合什么垃圾收集器使用?

  "-XX:+UseConcMarkSweepGC" :指定使用CMS后,会默认使用ParNew作为新生代收集器;

为什么只有ParNew能与CMS收集器配合

        CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作;

        CMS作为老年代收集器,但却无法与JDK1.4已经存在的新生代收集器Parallel Scavenge配合工作;
        因为
  Parallel Scavenge(以及G1)都没有使用传统的GC收集器代码框架
  ,而另外独立实现;而其余几种收集器则共用了部分的框架代码;
 

Serial收集器和ParNew收集器_wxy941011的博客-CSDN博客_serial和parnew

34、方法区、元空间,永久代的区别:

方法区和元空间

方法区是《Java虚拟机规范》中规定的一个内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

方法区是一个规范,它的实现取决于不同的虚拟机。

在Java8之前,HotSpot虚拟机使用 永久代来实现方法区。
而Java8之后,HotSpot虚拟机使用 元空间来实现方法区。

jvm - 方法区和元空间_个人文章 - SegmentFault 思否jvm - 方法区和元空间_个人文章 - SegmentFault 思否

 阿里二面:JVM方法区和元空间的关系到底是怎样的_牛客博客 (nowcoder.net)

35、方法区里面存的什么?

【面向对象-04】方法区是什么、方法区存放什么_百里慕溪的博客-CSDN博客_方法区存放什么

36、jdk8字符串常量池存放在哪里?

字符串常量池在堆中

java8以后字符串常量池的位置,以及元空间的探秘,使用VisualVM进行实战验证_诗水人间的博客-CSDN博客

37、运行时常量池的一道面试题(jdk8环境)

运行时常量池的一道面试题(jdk8环境)_诗水人间的博客-CSDN博客

38、浅谈 Minor GC,Marjor GC,Full GC 的触发机制

浅谈 Minor GC,Marjor GC,Full GC 的触发机制 - 掘金 (juejin.cn)

39、几道JVM调优实战面试题:

JVM调优实战_须佐能乎!的博客-CSDN博客_jvm调优实战

40、吞吐量、响应时间的关系:

这些度量之间的关系很复杂。有时可能以响应时间为代价而得到较高的吞吐量,而有时候又要以吞吐量为代价得到较好的响应时间。在其他情况下,一个单独的更改可能对两者都有提高。可接受的性能基于合理的吞吐量与合理的响应时间相结合。

通常,平均响应时间越短,系统吞吐量越大;平均响应时间越长,系统吞吐量越小。但是,系统吞吐量越大,未必平均响应时间越短。因为在某些情况(例如,不增加任何硬件配置)吞吐量的增大,有时会把平均响应时间作为牺牲,来换取一段时间处理更多的请求。

在JVM中,高吞吐量和暂停时间是矛盾的。为了提高吞吐量,就要尽量减少GC的发生,但是GC发生的次数少了,每次要回收的对象就会多,那暂停时间就会长,所以响应时间变长!

(1) 吞吐量优先的并行收集器
参数配置:
a、 -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8
说明:选择Parallel Scavenge收集器,然后配置多少个线程进行回收,最好与处理器数目相等。

b、-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+UseParallelOldGC
说明:配置老年代使用Parallel Old

c、-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100
说明:设置每次年轻代垃圾回收的最长时间。如何不能满足,那么就会调整年轻代大小,满足这个设置

d、-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100 -XX:+UseAdaptiveSizePolicy
说明:并行收集器会自动选择年轻代区大小和Survivor区的比例。

(2)响应时间优先的并发收集器
a、 -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
说明:设置老年代的收集器是CMS,年轻代是ParNew

b、-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
说明:首先设置运行多少次GC后对内存空间进行压缩,整理。同时打开对年老代的压缩(会影响性能)

41、CMS参数优化的流程图:

以下图片来自:GC 优化的一些总结 - Xueqiu Engineering Blog

42、JVM内存空间分配图:

其中,永久代,是jdk1.7之前方法区的实现方式;

jdk1.8之后方法区的实现是元空间  metaspace;

43、promotion failed原因,会导致什么结果和解决办法:

表面原因:promotion failed:Old 区没有足够的空间分配给 Young 区晋升的对象(即使总可用内存足够大)。

提升失败原因

当提升的时候,发现老年代也没有足够的连续空间来容纳该对象。
为什么是没有足够的连续空间而不是空闲空间呢?
老年代容纳不下提升的对象有两种情况: 

1. 老年代空闲空间不够用了;
2. 老年代虽然空闲空间很多,但是碎片太多,没有连续的空闲空间存放该对象; 

导致结果:

CMS线程每隔一段时间会去检查一些条件来确定是不是要来一次CMS GC,其中一个条件便是有没有发生过promotion failed,CMS GC被触发了。说起CMS GC,很多FGC的统计会把CMS GC算作一次FGC,包括CMS自己也认为自己是FGC,这里有一种解释:CMS GC需要被关注!!!因为CMS触发的结果是STW(CMS的初始标记和重新标记阶段),这对应用来说影响很大,因为STW意味着所有Java线程都会被block,JVM会在安全点将所有Java线程挂起,安全点的存在是为了让一些不安全的事情顺利的发生,比如CMS GC中的对象标记操作 。

解决方法

1. 如果是因为内存碎片导致的大对象提升失败,cms需要进行空间整理压缩;
2. 如果是因为提升过快导致的,说明Survivor 空闲空间不足,那么可以尝试调大 Survivor;
3. 如果是因为老年代空间不够导致的,尝试将CMS触发的阈值调低;

参考链接:JVM原理之GC垃圾回收器CMS详解 - 掘金 (juejin.cn)

44、gc日志demo解读

深入理解Java虚拟机——理解GC日志_小志的博客的博客-CSDN博客_java虚拟机gc

GC日志解读,这次别再说看不懂GC日志了_壹氿的博客-CSDN博客_gc日志详解

45、垃圾收集器有哪些

46、垃圾收集算法

详解垃圾收集算法 - 知乎 (zhihu.com)

47、jdk8环境下,默认使用 Parallel Scavenge(新生代)+ Serial Old(老年代)

JVM基础(五)垃圾收集器 - 知乎 (zhihu.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值