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-worldG1收集器(-XX:UseG1GC,复制+标记-整理算法)
将整个Java堆内存划分成多个大小相等的Region 年轻代和老年代不再物理隔离无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达 存储关联的且被GC的软引用,弱引用以及虚引用
相关文章
- 为什么 JVM 需要 GC详解编程语言
- JVM 深入学习:Java 解析 Class 文件过程解析详解编程语言
- 获取jvm的PID详解编程语言
- 检测 Java 是否运行在64bit 的JVM上的方法详解编程语言
- JVM垃圾回收算法(最全)详解编程语言
- JVM基础知识详解编程语言
- 浅析JVM内存结构和6大区域详解编程语言
- JVM类加载机制详解编程语言
- JVM的内部组成详解编程语言
- [四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式详解编程语言
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义详解编程语言
- 监控JVM内存使用情况,剩余空间小于2M时报警详解编程语言
- 一个可以参考的JVM内存分配详解编程语言
- JVM内存结构详解编程语言
- Linux查看JVM内存使用情况指南(linux查看jvm内存)
- Oracle JVM大路在何方(jvm路径 oracle)
- Redis引发JVM崩溃一个值得警惕的潜在风险(redis造成jvm死掉)