zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JVM整理详解编程语言

JVM编程语言 详解 整理
2023-06-13 09:11:51 时间

JVM三大性能调优参数 -Xms -Xmx -Xss 的含义

java -Xms128m -Xmx128m -Xss256k -jar -xxxx.jar 

-Xss:规定了每个线程虚拟机栈(堆栈)的大小

-Xms:堆的初始值

-Xmx:堆能达到的最大值


静态存储:编译时确定每个数据目标在运行时的存储空间需求

栈式存储:数据区需求在编译期未知,运行时模块入口确定

堆式存储:编译时或运行时模块入口都无法确定,动态分配


碎片相关:对产生的碎片远小于堆

分配方式:栈支持静态分配和动态分配,而堆仅支持动态分配

效率:栈的效率比堆高


JDK6及之前:intern方法首先去查询常量池中是否存在该字符串,若有,返回的是对常量池中此字符串的引用;若无,在池中添加这个字符串,并且也返回对常量池中此字符串的引用。


JDK6之后:也是先去查询常量池中是否有这个字符串,若有,同上;若无,情况相比JDK6就不同了,只会在常量池生成一个对堆里这个字符串对象的引用,且返回之。


//String a5 = "AA"; System.out.println(a4 == a4.intern());//注释掉上面一行就为false,反之为true

上面的例子就展示了这一点。


优点:执行效率高,程序执行受影响较小

缺点:易产生死锁 – 两个对象循环调用,计数始终不为0


通过判断对象的引用链是否可达来决定对象是否可以被回收。

可以作为GC Root的对象:

虚拟机栈中引用的对象 方法区中的常量引用的对象 方法区中的类静态属性引用的对象 本地方法栈中JNI(Native方法)的引用对象 活跃线程的引用对象

MinorGC – 年轻代

一个Eden区,满了就复制算法,到survivor区;每次Minor GC,存货对象年龄+1,到达一定年龄(默认15岁)进入老年代;survivor区放不下时分配担保直接进老年代。

两个Survivor区

调优参数:

-XX:SurvivorRatio:Eden和Survivor的比值,默认8:1 -XX:NewRatio:老年代和年轻代内存大小的比例 -XX:MaxTenuringThreshold:对象从年轻代晋升到年老代经过GC次数的最大阈值
CMS GC时出现promotion failed, concurrent mode failure Minor GC晋升到老年代的平均大小大于老年代的剩余空间 调用System.gc() 使用RMI(远程方式)来进行RPC来管理的应用,每隔一小时

CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)

无法和Parallel Scavenge配合

初始标记:stop-the-world 并发预清理 重新标记:stop-the-world

G1收集器(-XX:UseG1GC,复制+标记-整理算法)

将整个Java堆内存划分成多个大小相等的Region 年轻代和老年代不再物理隔离
无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达 存储关联的且被GC的软引用,弱引用以及虚引用