
JVM
文章平均质量分 86
阿杜童鞋
每天进步一点点。
展开
-
JVM运行时数据区域及JVM中对象的创建及对象的内存布局
什么是线程私有?由于jvm的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们就称这类内存区域为“线程私有”的内存。...原创 2018-05-21 14:03:32 · 564 阅读 · 0 评论 -
类加载概述以及类加载的时机
类从被再加到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括如下七个阶段:上图中,加载,验证,准备,初始化和卸载这5个夹断的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下也可以在初始化之后才开始.什么情况下必须对类进行"初始化"?1:遇到new,getstatic,putstatic或invokestatic这4条字节码指令时,如果类没有进行过...原创 2018-06-13 11:07:40 · 194 阅读 · 0 评论 -
内存溢出和内存泄露的区别
内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪...原创 2018-05-29 14:37:14 · 269 阅读 · 0 评论 -
Minor GC和Full GC
Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为java对象大多具备朝生夕灭的特性,所有Minor GC非常频繁,速度也很快.Full GC:指发生在老年代的GC,初选了Major GC,经常会伴随着至少一次的Full GC(并非绝对).Full GC的速度一般会比Minor GC慢10倍以上.什么时候会进行Minor GC?给新对象分配内存,新生代空间不足的时候.什么时候会进行F...原创 2018-06-04 15:04:47 · 241 阅读 · 0 评论 -
内存分配与回收策略
① 对象优先在新生代Eden分配:新生代总共可用空间为Eden区+一个Survivor区的总容量,如果剩下的一个Survivor容量不足以放下GC后的对象,就会把GC后新生代的对象放入老年代,新加入的对象放入新生代。② 大对象直接进入老年代:大对象是指需要大量连续内存空间的java对象,最典型的就是那种很长的字符串以及数组。经常出现大对象容易导致内存还有不少空间的时候就提前触发垃圾收集以获取足够的...原创 2018-05-23 15:11:48 · 147 阅读 · 0 评论 -
垃圾收集器分类
垃圾收集器分类:Serial收集器(新生代 复制算法):单线程,收集的时候会停掉其他所有线程直到它收集结束。简单高效,对于限定CPU的环境来说,Serial收集器由于没有线程交互的开销,所以可以获得最高的单线程收集效率。所以,Serial对于运行在Client模式下的虚拟机来说是一个很好的选择。ParNew收集器(新生代 复制算法):Serial收集器的多线程版本,在单CPU环境中绝对不会比Ser...原创 2018-05-23 13:52:51 · 178 阅读 · 0 评论 -
垃圾收集算法
标记-清除算法:效率不高,会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分派较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。图片引用自《深入JVM》复制算法:将内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样解决了效率问题,但是代价是将内存缩小...原创 2018-05-22 17:39:43 · 175 阅读 · 0 评论 -
如何判断对象是否存活和四种Reference的区别
堆:java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆容量限制后就会产生内存溢出异常OutOfMemoryError:java heap space。虚拟机栈和本地方法栈:如线程请求的栈深度大于虚拟机所允许的最大深度,抛出StackOverflowError异常。如果虚拟机在拓展栈时无法申请到足够的内...原创 2018-05-22 16:29:32 · 321 阅读 · 0 评论 -
类加载过程
加载阶段在加载阶段虚拟机需要完成以下3件事情:① 通过一个类的全限定名来获取定义此类的二进制字节流.② 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.③ 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口.验证阶段...原创 2018-06-21 10:45:20 · 168 阅读 · 0 评论