wordpress的站点地址怎么设置,文字变形logo设计,wordpress 跳转到首页,网页游戏开服表就找新壹玩对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程
加载 验证 解析 准备 初始化 使用 写在
对象内存分配方式
内存分配… 对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程
加载 验证 解析 准备 初始化 使用 写在
对象内存分配方式
内存分配的方法有两种:不同垃圾收集器不一样
指针碰撞(Bump the Pointer)空闲列表(Free List) 指针碰撞示意图:
内存分配安全问题
在分配内存的时候虚拟机给A线程分配内存过程中指针未修改。此时B线程同时使用了同样一块内存。是不是就出现了线程的安全性问题? 在JVM中有两种解决办法:
CAS 是乐观锁的一种实现方式。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。TLAB本地线程分配缓冲(Thread Local Allocation Buffer即TLAB):为每一个线程预先分配一块内存
JVM在第一次给线程中的对象分配内存时首先使用CAS进行TLAB的分配。当对象大于TLAB中的剩余内存或TLAB的内存已用尽时再采用上述的CAS进行内存分配。
对象内存分配流程【重要】: 对象怎样才会进入老年代?重点
对象内存分配:
新生代:新对象大多数都默认进入新生代的Eden区进入老年代的条件:四种情况 老年代的担保示意图:
小结
当Eden区存储不下新分配的对象时会触发minorGCGC之后还存活的对象按照正常逻辑需要存入到Survivor区。当无法存入到幸存区时此时会触发担保机制发生内存担保时需要将Eden区GC之后还存活的对象放入老年代。后来的新对象或者数组放入Eden区。
案例演示:对象分配过程
大对象直接进入老年代
package com.hero.jvm.object;
/**
* 测试:大对象直接进入到老年代
* -Xmx60m -Xms60m -XX:NewRatio2 -XX:SurvivorRatio8 -XX:PrintGCDetails * -XX:PretenureSizeThreshold
*
*/
public class YoungOldArea {public static void main(String[] args) {byte[] buffer new byte[1024*1024*20]; //20M}
}-XX:NewRatio2 新生代与老年代比值
-XX:SurvivorRatio8 新生代中Eden与两个Survivor区域比值
-XX:PrintGCDetails 打印详细GC日志
-XX:PretenureSizeThreshold 对象超过多大直接在老年代分配默认值为0不限制02-对象内存分配的过程:
/*
-Xmx600m -Xms600m -XX:PrintGCDetails
*/
public class HeapInstance {public static void main(String[] args) {ListPicture list new ArrayList();while (true){
} }try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();
}list.add(new Picture(new Random().nextInt(1024 * 1024)));
}
class Picture{private byte[] pixels;public Picture(int length){this.pixels new byte[length];}
}