JVM
装兔子的猫
这个作者很懒,什么都没留下…
展开
-
说说老年代的垃圾回收算法?常用的垃圾回收器都有什么?
老年代对象过多,老年代的内存空间满了要进行垃圾回收【老年代回收算法】老年代中长期存活的对象过多,不适用年轻代的复制算法老年代中,垃圾对象没有那么多【标记-清理算法】该算法并不是太好,会出现内存碎片(假设两个对象被回收,分别空出1M+1M的空间,如果过来了一个2M的对象,就没地方放了,因为需要连续的内存空间)标记垃圾对象,并在老年代中清理掉导致没有连续可用的内存空间【老年代采用标记-压缩算法】将存活对象压缩到一片内存空间中,剩余都是连续可用的内存空间,解决了内存碎片的问题原创 2020-12-22 20:33:07 · 2483 阅读 · 0 评论 -
说说JVM的年轻代垃圾回收算法?对象什么时候转移到老年代?
【STW】stop the world,停止JVM里的工作线程的运行,然后扫描所有对象,判断可回收和不可回收【YGC采用的复制算法】(1)第一次YGC,把Eden中存活的对象,复制到S1区(对象迁移、对象复制),然后清空Eden区(2)下一次YGC,把Eden+S1中存活的对象复制到S2中,清空Eden+S1(3)下一次YGC,把Eden+S2中存活的对象复制到S1中,清空Eden+S2(4)循环【对象移动到老年代】Spring容器引用的对象,会长期存活长期存活的对象(15次原创 2020-12-22 20:31:38 · 751 阅读 · 2 评论 -
说说JVM在哪些情况下会触发垃圾回收可以吗?
JVM内存是有限的,JVM中有个内存分代堆内存:年轻代+老年代,统称为堆,可设置大小年轻代分为三块:年轻代、S1区、S2区(survivor区)默认情况下,新生代:S1:S2比例是8:1:1假设年轻代2个G,那么实际上分为1.6G/0.2G/0.2G 新生代/年轻代(Eden区)1.6G S1区 0.2G S2区 0.2G 2G老年代对象一开始是放在年轻代中,如果eden区满了,会出Y...原创 2020-12-22 20:30:09 · 1256 阅读 · 0 评论 -
你知道JVM是如何运行起来的吗?我们的对象是如何分配的?
一个类里包含一个main方法,执行main方法,此时会自动创建一个JVM进程,会默认有一个main线程,这个main线程就负责这个main方法的代码,进而创建各种对象Tomcat,类都会加载到JVM中,spring容器会将我们的类实例化成bean,有工作线程会来执行我们bean实力对象里的方法和代码,进而会创建其他的各种类,实现业务逻辑(1)Tomcat有个类加载器,会将我们自己写的系统中的类加载到metaspace元数据区(2)Tomcat启动会去启动spring容器(3)spring容器原创 2020-12-22 20:25:15 · 227 阅读 · 0 评论 -
JVM中有哪几块内存区域?Java8之后对内存分代做了什么改进?
堆内存:存放对象,所有线程均可使用栈内存:工作线程自己独有的永久代:自己写的类加载的地方,存放一些常量池、类信息Java8内存分代的改进【永久代】改叫【metaspace元空间】,将常量池存放在堆内存中,类信息存放在metaspace元空间...原创 2020-12-22 20:23:05 · 702 阅读 · 2 评论 -
【面试题】volatile底层是如何基于内存屏障保证可见性和有序性的?
volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?volatile+原子性:不能保证原子性,虽说有些极端特殊的情况下有保证原子性的效果极端场景:oracle、64位的long的数字进行操作时【面试题】问volatile底层、java内存模型、问volatile是如何保证可见性的,缓存一致性协议,追问,volatile之后,具体是发送了什么指令去实现什么效果?(1)#lock前缀指令(记住)、嗅探机制MESI缓存一致性协议对volatile修饰的变量,执行写..原创 2020-12-08 15:05:25 · 990 阅读 · 0 评论 -
【面试题】你知道指令重排以及happens-before原则是什么吗?
happens-before原则,一定程度上避免指令重排编译器、指令器可能对代码重排序、乱排、要守一定的规则,happens-before原则。只要符合happens-before的原则,那么就不能胡乱重排序,如果不符合这个规则,那么就可以自己排序。happens-before八大原则单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock原创 2020-12-08 15:03:17 · 545 阅读 · 0 评论 -
【面试题】能从底层角度聊聊volatile关键字的原理吗?
如果面试官上来直接问volatile,那么应该先从内存模型开始讲,然后谈原子性、可见性、有序性的理解,最后再讲volatile关键字的原理volatile关键字是用来解决可见性和有序性volatile用途:(1)保证内存可见性 (2)禁止指令重排volatile会在线程1执行data++之后将值设置会工作内存并写到主内存中的同时,将其他线程的工作缓存中data的值设置为失效。当线程在执行下次操作的时候,发现工作内存中的值失效了,回去主内存中再次读取【评论区】1、可见性是指,下次使用的时候原创 2020-12-08 15:00:43 · 175 阅读 · 0 评论 -
【面试题】你知道Java内存模型中的原子性、有序性、可见性是什么吗?
连环炮:Java内存模型--》原子性、可见性、有序性--》volatile--》happens-before/内存屏障并发编程过程中,可能会产生的三类问题:1.可见性线程1 run代码:data++线程2 run代码:while(data == 0){sleep(100);}没有可见性:一个线程已经更新了data,另外一个线程看不见一个线程做data++操作,另外一个线程对data进行读取并判断操作。当线程1执行之前(1)到(6)操作,线程2已经获取到主内存中data的数据。在线原创 2020-12-08 14:59:38 · 266 阅读 · 0 评论 -
【面试题】谈谈你对内存模型的理解可以吗?
8个指令:read/write、load/store、use、assign、lock/unlock read 将主存中的数据读取到CPU的高速缓存cache中 write 将CPU的cache中数据写回到主存中 load 将CPU的高速缓存cache中数据加载到JVM的寄存器中 store 将JVM寄存器中的数据写入CPU的cache中原创 2020-12-08 14:52:13 · 159 阅读 · 0 评论