龙华专业做网站,网站布局图片,深圳企业年报,深圳搬家公司哪家好说一下JVM中的分代回收
堆的区域划分 1.堆被分为了两份:新生代和老年代[1:2] 2.对于新生代#xff0c;内部又被分为了三个区域。Eden区#xff0c;幸存者区survivor(分成from和to)[8:1:1]
对象回收分代回收策略
1.新创建的对象#xff0c;都会先分配到eden区 2.当伊园内存…说一下JVM中的分代回收
堆的区域划分 1.堆被分为了两份:新生代和老年代[1:2] 2.对于新生代内部又被分为了三个区域。Eden区幸存者区survivor(分成from和to)[8:1:1]
对象回收分代回收策略
1.新创建的对象都会先分配到eden区 2.当伊园内存不足标记伊园与from (现阶段没有)的存活对象 3.将存活对象采用复制算法复制到to中复制完毕后伊甸园和from 内存都得到释放 4.经过一段时间后伊甸园的内存又出现不足标记eden区域to区存活的对象将其复制到from区 5。当幸存区对象熬过几次回收(最多15次)晋升到老年代(幸存区内存不足或大对象会提前晋升
MinorGC、Mixed GC、 FullGC的区别是什么
MinorGc[yogng GC]发生在新生代的垃圾回收暂停时间短(STW) Mixed GC新生代 老年代部分区域的垃圾回收G1 收集器特有 FullGC: 新生代 老年代完整垃圾回收暂停时间 (STW)应尽力避免
说一下JVM有哪些垃圾回收器?
在jvm中实现了多种垃圾收集器包括: 串行垃圾收集器: Serial G新生代、Serial Old GC老年代 并行垃圾收集器: Parallel Old GC新生代、ParNew GCCMS老年代 (并发)垃圾收集器: CMS GC作用在老年代。并发、标记清理算法停顿较少。 G1垃圾收集器作用在新生代和老年代
强引用、软引用、弱引用、虚引用的区别?
强引用:只要所有 GC Roots 能找到就不会被回收 软引用: 需要配合SoftReference使用当垃圾多次回收内存依然不够的时候会回收软引用对象 弱引用:需要配合WeakReference健用只要进行了垃圾回收就会把弱引用对象回收 虚引用:必须配合引用队列使用被引用对象回收时会将虚引用入队由 Reference Handler 线程调用虚引用相关方法释放外部内存如直接内存
JVM 调优的参数可以在哪里设置参数值
JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置修改TOMCAT_HOME/bin/catalina.sh文件 jar包部署在启动参数设置 java -Xms512m -Xmx1024m -jar xxxx.jar
JVM 调优的参数都有哪些?
1、设置堆空间大小 设置堆的初始大小和最大大小为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间通常把最大、初始大小设置为相同的值
-Xms:设置堆的初始化大小
设置堆的最大大小Xmx:不指定单位默认为字节指定单位按照指定的单位设置
堆空间设置多少合适?
最大大小的默认值是物理内存的1/4初始大小是物理内存的1/64 堆太小可能会频繁的导致年轻代和老年代的垃圾回收会产生stw暂停用户线程堆内存大肯定是好的存在风险假如发生了fullgc,它会扫描整个堆空间暂停用户线程的时间长设置参考推荐:尽量大也要考察一下当前计算机其他程序的内存使用情况 2、虚拟机栈的设置 虚拟机栈的设置:每个线程默认会开启1M的内存用于存放栈帧、调用参数局部变量等但一般256K就够用。通常减少每个线程的堆栈可以产生更多的线程但这实际上还受限于操作系统
-Xss 对每个线程stack大小的调整,-Xss128k3、年轻代中Eden区和两个Survivor区的大小比例 设置年轻代中Eden区和两个Survivor区的大小比例。该值如果不设置则默认比例为8 1:1。通过增大Eden区的大小来减少GC发生的次数但有时我们发现虽然次数减少了但Eden区满的时候由于占用的空间较大导致释放缓慢此时STW的时时间较长因此需要按照程序情况调优
XXSurvivorRatio8表示年轻代中的分配比率: survivor:eden 284、年轻代晋升老年代闯值
XX:MaxTenuringThresholdthreshold默认为15 取值范围0-15
5、设置垃圾回收收集器 java 8默认的垃圾回收器是G1Garbage First它是一种分代回收器能够更有效地回收内存
-XX:UseG1GCG1会将Java堆分割成多个不同大小的区域每个区域都有自己的垃圾回收周期。G1会根据这些区域中的垃圾收集情况选择性地回收垃圾以减少总体停顿时间。
jvm调优的工具
1、jps进程情况 2、jstack查看进程中线程的堆栈信息可以看有没有死锁
jstack [option] pid3、jmap查看进程中的堆信息用于生成堆转内存快照、内存使用情况
jmap -heap pidParallel GC with 8 thread(s)//并行的垃圾回收器
MaxHeapSize 8524922880 (8130.MB)//堆空间允许的最大值
NewRatio2/新生代与老年代的堆空间比值表示新生代: 老年代1: 2
SurvivorRatio8 幸存者区比eden区的比例为118Heap Usage :Ps Young Generation
Eden Space: //Eden使用情况
From Space: //Survivor-From 使用情况
capacity 22020896 (21.0MB)
used(e.eMB0
free22028896 (21.6B)
8.e% usedTo Space: //Survivor-to使用情况old Generation//老年代 使用情况jmap -dump:formatb,fileheap.hprof pid
formatb表示以**hprof**二进制格式转储Java堆的内存
filefilename用于指定快照dump文件的文件名
4、jstat统计检测工具用于显示垃圾回收信息类加载信息新生代的统计等
jvm监控的可视化工具
1、jconsole用于对jvm的内存线程类的监控 2、VisualVM能够监控线程内存情况
Java内存泄露的排查思路?
内存泄漏通常是指堆内存通常是指一些大对象不被回收的情况 1、通过jmap或设置jvm参数获取堆内存快照dump
使用jmap命令获取运行中程序的dump文件 imap -dump:formatb,fileheap.hprof pid程序中断需要设置VM参数获取生成dump文件-XX:HeapDumpOnOutOfMemoryError XX:HeapDumpPath/home/app/dumps/
2、通过工具VisualVM去分析dump文件VisualVM可以加载离线的dump文件 3、通过查看堆信息的情况可以大概定位内存溢出是哪行代码出了问题 4、找到对应的代码通过阅读上下文的情况进行修复即可
CPU飙高排查方案与思路?
1.使用top命令查看占用cpu的情况
2.通过top命令查看后可以查看是哪一个进程占用cpu较高
top3使用ps命令查看进程中的线程信息
ps H -eo pid,tid,%cpu lgrep 40940 4.使用istack命令查看进程中哪些线程出现了问题最终定位问题
jstack 40940 此处是进程id.展示的全部线程id但是是16进制
十进制转换为十六进制
printf %x\n 40955