jvm虚拟机

一、jvm结构

jvm虚拟机

二、永久代和元空间的区别?
1、jdk1.8以前是永久代,之后是元空间,最大的区别是永久代使用的是虚拟机的内存,元空间使用的是系统内存
2、Class在被加载的时候被放入永久区域,GC不会在主程序运行期对永久区域进行清理,所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常;
   元空间的本质和永久代类似,都是对JVM规范中方法区的实现,设置参数不同MetaSpaceSize初始化元空间大小,MaxMetaspaceSize限制元空间大小上限,防止异常占用过多物理内存,
   永久代内存使用PermSize配置;
3、字符串常量池存在永久代中,容易出现性能问题和内存溢出
4、Jstat 和 JVisualVM两个工具,监控新Metaspace内存空间的动态增长和垃圾回收过程


三、垃圾回收算法?
1、标记-清除算法 缺点:碎片太多可能会使存储大对象会触发GC回收,造成内存浪费以及时间的消耗
2、复制算法 缺点:需要将可用内存缩小一半,对象存活率较高时,需要持续的复制工作,效率比较低
3、标记整理算法 针对复制算法在对象存活率较高时持续复制导致效率较低的缺点进行改进的,该算法是在标记-清除算法基础上,不直接清理,而是使存活对象往一端游走,然后清除一端边界以外的内存,这样既可以避免不连续空间出现,还可以避免对象存活率较高时的持续复制,这种算法适合老生代
4、分代收集算法 目前虚拟机使用的回收算法,将内存分为各个年代,在不同年代使用不同的算法,新生代存活率低,使用复制算法,老年代存活率高,使用标记整理算法


新生代 :eden from to 默认比例是:8:1:1
新生代与年老代比例是 1 :2


四、内存溢出内存泄漏有什么区别?
内存溢出:java中内存溢出是没有及时垃圾回收,申请空间不够,到内存溢出;
内存泄漏:java中方法中没有释放,导致内存泄漏