jvm原理及性能调优(jvm面试题总结及答案)
大家好,今天来为大家分享jvm原理及性能调优的一些知识点,和jvm面试题总结及答案的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
JVM性能调优-G1
本篇是对Java官网G1收集器调优的精简版。针对G1垃圾的收集阶段可能出现的问题,非合理内存分配,大对象占用,Full GC等问题作出解决方式和操作参数。
G1是一个吞吐量和时间延迟之间相互平衡的收集器。目标是高吞吐量下提供相对较小、统一的暂停。
所以如果是交互性强的应用程序,使用G1时需要基于时延优先进行考虑。
虚拟机从操作系统内存中分配或归还内存可能会导致不必要的延迟。通过使用选项-Xms和-Xmx将最小和最大堆大小设置为相同的值,并使用- XX:+AlwaysPreTouch预触摸所有内存,以将这项工作移到VM启动阶段,从而避免延迟。
并行处理 Reference对象,ParallelRefProcEnabled默认值false,若 GC log里出现 Reference处理时间较长的日志,可以开启此参数- XX:+ParalleRefProcEnabled。开启后会使用jvm可用的线程数进行处理,但官网上提到的-XX:ReferencesPerThread参数在jdk17的版本中没有找到,猜测可能是jvm内部控制不再作可调试的参数。
年轻代收集所花费的时间大致与年轻代的大小成正比。官网给出的两个参数- XX:G1NewSizePercent,-XX: G1MaxNewSizePercent在jdk17中没有找到,在没有固定年轻代大小时,G1会进行动态调整,所以这个调优的参考性不大,可以忽略。
减少老年代regions暂停时间
RS是一个抽象的数据结构,具体的实现由table card完成。一般会把记忆集和卡表放在一起讨论。简单来讲就是所有对象引用关系的一个集合,GCRoot时扫描的不是去实际的内存区域,否则跨代引用时从新生代到老年代会是一个漫长的过程。RS很好的解决了跨代引用的问题。由于RS会动态更新,垃圾收集必须先等RS更新完毕后才去执行。所以RS更新如果耗时过长则会影响回收时间。
RS的大小跟堆空间是成正比的。
扫描RS时间也由G1为保持低存储容量而执行的压缩量决定。记忆的集合存储在内存中越紧凑,在垃圾收集期间检索存储的值所花费的时间就越多。G1自动执行这种压缩,称为记忆集粗化,同时根据该区域记忆集的当前大小更新记忆集。特别是在最高压缩级别时,检索实际数据可能非常慢。
使用选项- XX:G1SummarizeRSetStatsPeriod结合gc+remset=trace级别日志显示是否发生粗化。
解决方案
操作选项
java软件工程师的能力要求
不知道你是定位到什么样的程度,如果只是入这一行的话,只要熟练运用java语法,了解java常用的一些API就行,三大框架的话,我们开发中常用的还是struts1、2,spring,hibernate都不怎么用的。HTML和javascript不需要你多么的熟练,像我的话,经常是忘记某个方法了,就去网上查查,一大堆的解决办法~~,还有一个就是数据库知识,这是做开发必备的能力,一般公司常用的有MySQL,SqlServer,Oracle等等,因为那些操作数据库的语句都是差不多类似的,所以你只需要学习其中一种就ok了,学会一种其他的就会触类旁通。本人做java开发2年,了解的东西也比较浅,如果你想要了解更多的话,建议你去一些it网站,或者社区看看。我只能告诉你这么多了。还有,给你提个醒,做开发是非常累的,加班已经成为这个行业的一种常态,所以你真要入行的话,请做好心里准备~~~不过干这行能熬过开头2年,工资还是可以的!祝你好运~~~~~~~
关于jvm原理及性能调优,jvm面试题总结及答案的介绍到此结束,希望对大家有所帮助。