分代回收器分为新生代和老年代,新生代大概占1/3,老年代大概占2/3; 新生代包括Eden、From Survivor、To Survivor; Eden区和两个survivor区的 的空间比例 为8:1:1 ; 垃圾回收器的执行流程: 把 Eden + From Survivor 存活的对象放入 To Survivor 区; 清空 Eden + From Survivor 分区,From Sur
CMS 垃圾回收器是Concurrent Mark Sweep,是一种同步的标记-清除,CMS分为四个阶段: 初始标记,标记一下GC Root能直接关联到的对象,会触发“Stop The World”; 并发标记,通过GC Roots Tracing判断对象是否在使用中; 重新标记,标记期间产生对象的再次判断,执行时间较短,会触发“Stop The World”; 并发清除,清除对象,可以和用户线
新生代回收器:Serial、ParNew、Parallel Scavenge 老年代回收器:Serial Old、Parallel Old、CMS 新生代回收器一般采用的是复制算法,复制算法效率较高,但是浪费内存; 老生代回收器一般采用标记清楚算法,比如最常用的CMS;
类在程序运行的时候就会被加载,方法是在执行的时候才会被加载,如果没有任何引用了,Java自动垃圾回收,也可以用System.gc()开启回收器,但是回收器不一定会马上回收。 静态变量在类装载的时候进行创建,在整个程序结束时按序销毁; 实例变量在类实例化对象时创建,在对象销毁的时候销毁; 局部变量在局部范围内使用时创建,跳出局部范围时销毁;
说一下 jvm 有哪些垃圾回收器?
1、对象是否已死算法 引用计数器算法 可达性分析算法 2、GC算法 (1)标记清除算法 如果对象被标记后进行清除,会带来一个新的问题--内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。 (2)复制算法(Java堆中新生代的垃圾回收算法) 先标记待回收内存和不用回收内存; 将不用回收的内存复制到新的内存区域; 就的内存区
1、引用计数算法 (1)判断对象的引用数量 通过判断对象的引用数量来决定对象是否可以被回收; 每个对象实例都有一个引用计数器,被引用+1,完成引用-1; 任何引用计数为0的对象实例可以被当做垃圾回收; (2)优缺点 优点:执行效率高,程序受影响较小; 缺点:无法检测出循环引用的情况,导致内存泄漏; 2、可达性分析算法 通过判断对象的引用链是否可达来决定对象是否可以被回收。 如果程序无法再引用该对象
如果一个类收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器执行,如果父加载器还存在其父加载器,则进一步向上委托,依次递归,请求将最终到达顶层的启动类加载器,如果父类加载器可以完成父加载任务,就成功返回,如果父加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派模型。 双亲委派模式的优势: 避免重复加载; 考虑到安全因素,java核心api中定义类型不会被随意替
JVM类加载机制主要有三种: 1、全盘负责 类加载器加载某个class时,该class所依赖的和引用其它的class也由该类加载器载入。 2、双亲委派 先让父加载器加载该class,父加载器无法加载时才考虑自己加载。 3、缓存机制 缓存机制保证所有加载过的class都会被缓存,当程序中需要某个class时,先从缓存区中搜索,如果不存在,才会读取该类对应的二进制数据,并将其转换成class对象,存入
当程序主动使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接、初始化3个步骤对该类进行类加载。 1、加载 加载指的是将类的class文件读入到内存中,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器由JVM提供,开发者也可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器可以从不同来源加载类的二进制数据,通常有如下几
运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。 1、堆 堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。 2、方法区 方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。 3、栈 栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。 (1)栈帧 每个方法从调用到执行的过程就是一个栈
JVM包括类加载子系统、堆、方法区、栈、本地方法栈、程序计数器、直接内存、垃圾回收器、执行引擎。 1、类加载子系统 类加载子系统负责加载class信息,加载的类信息存放于方法区中。 2、直接内存 直接内存是在Java堆外的、直接向系统申请的内存空间。访问直接内存的速度会由于Java堆。出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。 3、垃圾回收器 垃圾回收器可以对堆、方法区、直接内存进行回
vhost可以理解为mini版的RabbitMQ,其内部均含有独立的交换机、绑定、队列,最重要的是拥有独立的权限系统,可以做到vhost范围内的用户控制。从RabbitMQ全局考虑,不同的应用可以跑在不同的vhost上,作为不同权限隔离的手段。
1、RabbitMQ有哪些重要的角色? 客户端、RabbitMQ、服务端。 2、有哪些重要的组件? (1)connectionFactory(连接管理器) 应用程序与RabbitMQ之间建立连接的管理器。 (2)Channel(信道) 消息推送使用的信道。 (3)RoutingKey(路由键) 用于把生产者的数据分配到交换机上。 (4)Exchange(交换机) 用于接受和分配消息。 (5)Bin
1、解决异步问题 例如用户注册,发送邮件和短信反馈注册成功,可以使用RabbitMQ消息队列,用户无需等待反馈。 2、服务间解耦 订单系统和库存系统,中间加入RabbitMQ消息队列,当库存系统出现问题时,订单系统依旧能正常使用,降低服务间耦合度。 3、秒杀系统 利用RabbitMQ的最大值,实现秒杀系统。