这篇文章主要讲解了“JVM如何优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM如何优化”吧!
垃圾回收的方式:复制算法、标记整理、标记清除、分代回收
垃圾回收的实现:Serial
、parNew
、parallel Scavenge
和g1d
等等
graph LR A("Eden") B("from") C("to") A -.- B B -.- C
Java堆中,默认Eden: from: to = 8: 1: 1
将转移到老年代的对象数量降低到最小;
减少fullGC的执行时间
频繁有大对象在新生代发生复制算法,性能大大降低?
-XX:PretenureSizeThreshold=<byte size> # 新生代中的对象进入老年代的大小阈值
当对象大小超过设定的字节大小,会直接进入老年代,不接受复制算法的影响
FGC 太过频繁,怎么解决?
新生代过小,导致对象提前进入老年代,触发老年代发送FGC;
老年代较大,进行GC时耗时较大;
-XX:NewRatio=4 # 老年代 与 新生代的 比值,即新生代:老年代 = 4:1 -XX:SurvivorRatio=4 # Eden 与 一个 Survivor 的比值,即 Eden: Survivor = 4:1
OOM (Out Of MemoryError) 内存溢出错误与SO(Stack OverFlow) 栈溢出?
Xss
设置过小,而每个方法执行需要的局部变量内存太大或者方法嵌套循环次数太高就是出现
存在死循环或者不断重复创建对象,堆实际大小超过了Xmx
限制
虚拟机装载了太多Class
和jar
信息,使得永久代(之前叫方法区)空间不够
理解完后我们去解决
Java虚拟机规范 Java 堆的原文:The heap is the runtime data area from which memory for all class instances and arrays is allocated.
我们都知道,每个线程生命周期与虚拟机栈一样,间接说明创建线程的同时也会创建对应的私有虚拟机栈,用于Java方法执行的内存模型
而Java中提供JVM
调优的三大参数:
用于Java堆(新生代和老年代)
-Xms, -Xmx
用于永久代
-XX:PermSize, -XX:MaxPermSize
用于线程栈,不同在于前者可以通过k、m和g来设置,后者要“=数字”,默认以KB(千字节)为单位
-Xss, -XX:ThreadStackSize
首先先理解堆,堆是GC
收集器管理的主要区域,这时应该会联想到前文所讲的新生代与老年代,更深入就是Eden
、From
和To
了。
首先先分类,内存溢出有栈溢出和堆溢出,-Xms
和-Xms
是设置Java
堆的初始化大小和可扩展最大值,一般设置成一致,避免发生内存抖动,而-Xss
则是Stack Size
的意思,即是每个线程创建虚拟机栈的大小
而且内存受操作系统限制,溢出的问题根源也在这里
物理最大内存 = 保留内存 + Xmx(堆) + Xss(栈) * 线程数 Xss = 虚拟机栈宽度(栈帧大小) * 虚拟机栈深度(栈帧数) 栈帧 = 局部变量表 + 操作数栈 + 动态链接 + 方法入口 + 其他
内存因为永久代导致的溢出,可以清理应用程序中web-inf/lib
下的jar
,或者tomcat
中启动了多个程序则公用相同的Jar
其他内存溢出还有诸如直接内存内存溢出、垃圾回收超时内存溢出、创建本地线程内存溢出、超出交换区内存溢出、数组超限内存溢出、系统杀死进程内存溢出。
感谢各位的阅读,以上就是“JVM如何优化”的内容了,经过本文的学习后,相信大家对JVM如何优化这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。