怎么样建立网站方案,中国建设网官方网站电子银行,wordpress 修改,长沙网站优化电话亲爱的读者们#xff0c;欢迎来到本篇博客#xff0c;这是JVM第七次分享#xff0c;下面是七个JVM常用常面的分享#xff0c;请笑纳 目录 1. 几个与JVM 内存相关的核心参数2.如何计算一个对象的大小3.堆为什么要分为新生代和老年代4.JVM堆的年轻代为什么要有两个 Survivor…亲爱的读者们欢迎来到本篇博客这是JVM第七次分享下面是七个JVM常用常面的分享请笑纳 目录 1. 几个与JVM 内存相关的核心参数2.如何计算一个对象的大小3.堆为什么要分为新生代和老年代4.JVM堆的年轻代为什么要有两个 Survivor 区?5.Eden 区与 Survivor 区的空间大小比值为什么默认是 8:1:1? 1. 几个与JVM 内存相关的核心参数
-Xms Java 堆内存的大小;-Xmx Java 堆内存的最大大小;-Xmn Java 堆内存中的新生代大小扣除新生代剩下的就是老年代的内存大小-XX:MetaspaceSize 元空间大小-XX:MaxMetaspaceSize 元空间最大大小;-Xss 每个线程的栈内存大小;-XX:SurvivorRatio8 设置 eden 区 和survivor 区大小的比例默认是 8:1:1;-XX:MaxTenuringThreshold5 年龄阈值;-XX:UseConcMarkSweepGC 指定 CMS 垃圾收集器-XX:UseG1GC指定使用 G1 垃圾回收器
2.如何计算一个对象的大小
引用一个apache提供的lucene工具包
dependencygroupIdorg.apache.lucene/groupIdartifactIdlucene-core/artifactIdversion4.0.0/version
/dependencyData
public class People {private int id;private String username;private BigDecimal money;private byte[] bytes new byte[1024 * 1024]; // 这里1024*1024byte等于1mpublic People() {}public static void main(String[] args) {People people new People();long size RamUsageEstimator.sizeOf(people);String humanedSize RamUsageEstimator.humanSizeOf(people);System.out.println(size: size);System.out.println(humanedSize: humanedSize);}
}size:1048624
humanedSize:1 MB3.堆为什么要分为新生代和老年代
因为年轻代和老年代不同的特点年轻代的对象它的特点是创建之后很快就会被回收所以需要用一种垃圾回收算法老年代的对象它的特点是需要长期存活所以需要另外一种垃圾回收算法所以需要分成两个区域来放不同的对象
绝大多数对象都是朝生夕灭的 如果一个区域中大多数对象都是朝生夕灭那么把它们集中放在一起每次回收时只关注如何保留少量存活对象而不是去标记那些大量将要被回收的对象就能以较低的代价回收到大量的空间;熬过越多次垃圾收集的对象就越难以回收; 如果是需要长期存活的对象那把它们集中放在一块虚拟机便可以使用较低的频率来回收这个区域这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用JVM 划分出新生代、老年代之后垃圾收集器可以每次只回收其中某一个或者某些部分的区域同时也有了“Minor GC”“Major GC”“Full GC”这样的回收类型的划分;
Minor GC/Young GC : 新生代收集Major Gc/Old GC: 老年代收集Full GC: 整堆收集收集整个 Java 堆和元空间/方法区的垃圾收集Mixed GC: 混合收集收集整个新生代以及部分老年代的垃圾收集目前只有 G1 收集器会有这种行为; 4、针对不同的区域对象存亡特征采用不同的垃圾收集算法标记-复制算法标记-清除算法标记-整理算法
4.JVM堆的年轻代为什么要有两个 Survivor 区?
如果没有 Survivor 区会怎么样? 此时每触发一次 Minor GC就会把 Eden 区的对象复制到老年代这样当老年代满了之后会触发 Major Gc/Full GC(通常伴随着 MinorGC)比较耗时所以必须有 Survivor 区如果只有1个 Survivor 区会怎么样? 刚刚创建的对象在 Eden 中一旦 Eden 满了触发一次 Minor GCEden 中存活的对象就会被移到s区下次eden满了时进行MinorGCEden区和s区就马上到老年代这样相对也会更快的触发fullGC影响性能。
5.Eden 区与 Survivor 区的空间大小比值为什么默认是 8:1:1?
一个 eden 区 新生代对象出生的地方两个 survivor 区一个用来保存上次新生代 GC 存活下来的对象还有一个空着在新生代GC 时把 edensurvivor 中存活对象复制到这个空的 survivor 中统计和经验表明90%的对象朝生夕死存活时间极短每次 gc 会有 90%对象被回收剩下的10%要预留一个 survivor空间去保存。
如果有任何疑问或建议欢迎在评论区留言我们将尽力解答。 感谢您的耐心阅读