c 做网站需要什么知识,无锡网站推广优化费用,邯郸市人社局,建网站企业1.内存区域划分根据我们之前介绍的垃圾收集算法#xff0c;限定商用虚拟机基本都采用分代收集算法进行垃圾回收。根据对象的生命周期的不同将内存划分为几块#xff0c;然后根据各块的特点采用最适当的收集算法。大批对象死去、少量对象存活的#xff0c;使用复制算法#…1.内存区域划分根据我们之前介绍的垃圾收集算法限定商用虚拟机基本都采用分代收集算法进行垃圾回收。根据对象的生命周期的不同将内存划分为几块然后根据各块的特点采用最适当的收集算法。大批对象死去、少量对象存活的使用复制算法复制成本低对象存活率高、没有额外空间进行分配担保的采用标记-清除算法或者标记-整理算法。从上面的图可以看出 JVM区域总体分两类heap区和非heap区。1.heap区又分为- Eden Space(伊甸园)、- Survivor Space(幸存者区)、- Old Gen(老年代)。2.非heap区又分- Code Cache(代码缓存区)- Perm Gen(永久代)- Jvm Stack(java虚拟机栈)- Local Method Statck(本地方法栈)2.内存区域介绍1.年轻代HotSpot JVM把年轻代分为了三部分1个Eden区和2个Survivor区(分别叫from和to)。默认比例为81,为啥默认会是这个比例接下来我们会聊到。一般情况下新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后如果仍然存活将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC年龄就会增加1岁当它的年龄增加到一定程度时就会被移动到年老代中。因为年轻代中的对象基本都是朝生夕死的(80%以上)所以在年轻代的垃圾回收算法使用的是复制算法复制算法的基本思想就是将内存分为两块每次只用其中一块当这一块内存用完就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。在GC开始的时候对象只会存在于Eden区和名为“From”的Survivor区Survivor区“To”是空的。紧接着进行GCEden区中所有存活的对象都会被复制到“To”而在“From”区中仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中没有达到阈值的对象会被复制到“To”区域。经过这次GC后Eden区和From区已经被清空。这个时候“From”和“To”会交换他们的角色也就是新的“To”就是上次GC前的“From”新的“From”就是上次GC前的“To”。不管怎样都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程直到“To”区被填满“To”区被填满之后会将所有对象移动到年老代中。有关年轻代的JVM参数1)-XX:NewSize和-XX:MaxNewSize用于设置年轻代的大小建议设为整个堆大小的1/3或者1/4,两个值设为一样大。2)-XX:SurvivorRatio用于设置Eden和其中一个Survivor的比值这个值也比较重要。3)-XX:PrintTenuringDistribution这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold用于设置晋升到老年代的对象年龄的最小值和最大值每个对象在坚持过一次Minor GC之后年龄就加1。2.old老年代老年代用于存放新生代中经过多次垃圾回收仍然存活的对象也有可能是新生代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象这些对象的年代已经足够old了就会放入到老年代。当老年代被放满的之后虚拟机会进行垃圾回收称之为Major GC。由于Major GC除并发GC外均需对整个堆进行扫描和回收因此又称为Full GC。heap区即堆内存整个堆大小年轻代大小 老年代大小。堆内存默认为物理内存的1/64(1GB)默认空余堆内存小于40%时JVM就会增大堆直到-Xmx的最大限制可以通过MinHeapFreeRatio参数进行调整默认空余堆内存大于70%时JVM会减少堆直到-Xms的最小限制可以通过MaxHeapFreeRatio参数进行调整。3.Code Cache代码缓存区它主要用于存放JIT所编译的热点代码。CodeCache代码缓冲区的大小在client模式下默认最大是32m在server模式下默认是48m这个值也是可以设置的它所对应的JVM参数为ReservedCodeCacheSize 和 InitialCodeCacheSize可以通过如下的方式来为Java程序设置。-XX:ReservedCodeCacheSize128mCodeCache缓存区是可能被充满的当CodeCache满时后台会收到CodeCache is full的警告信息如下所示“CompilerThread0” java.lang.OutOfMemoryError: requested 2854248 bytes for Chunk::new. Out of swap space?4.Perm Gen(永久代) (JDK1.8之后被元空间替代)Perm Gen全称是Permanent Generation space称之为永久代其实指的就是这个方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范而后者则是 JVM 规范的一种实现并且只有 HotSpot 才有 “PermGen space”而对于其他类型的虚拟机如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息Class在被Load进入这个区域后如果应用程序LOAD很多Class的话就很可能会出现PermGen space错误比如对于动态生成类的情况比较容易出现永久代的内存溢出。它的默认大小为物理内存的1/64。转载地址http://ifeve.com/jvm-yong-generation/