JVM
Java JVM的一些知识和面试题
Blakie
You got a dream, you gotta protect it.
展开
-
什么是GC?为什么存在GC?
GC(Garbage Collection):JAVA/.NET中的垃圾回收器。Java是由C++发展来的。它摈弃了C++中一些繁琐容易出错的东西。其中有一条就是这个GC。而C#又借鉴了JAVA。在老式的C/C++程序中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段...原创 2020-02-12 10:56:20 · 932 阅读 · 0 评论 -
双亲委派模型、双亲委派机制
双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。双亲委派机制:1、当AppClassLoader加载一个class时,它首先不会自己去尝试...原创 2020-02-12 10:57:11 · 168 阅读 · 0 评论 -
JVM垃圾回收器
垃圾收集器可以分为回收新生代和回收老年代两种类型收集器。其中回收新生代收集器有Serial、PraNew、Parallel Scavenge;回收老年代的收集器有Serial Old、Parallel Old、CMS;还有用于回收整个Java堆的G1收集器。新生代收集器:Serial收集器(复制算法):新生代单线程收集器,在进行垃圾回收时需要停止其他的所有工作线程。ParNew收集...原创 2020-02-12 10:57:03 · 93 阅读 · 0 评论 -
Minor GC安全检查
Minor GC:发生在年轻代,频率较高速度较快Major GC:清理永久代Full GC:清理整个堆空间——包括年轻代和老年代在Minor GC之前,检查老年代的可用空间是否大于年轻代的对象总和,若大于则是一次安全的GC。若不大于且允许承担失败,则计算历次晋升到老年的对象的平均大小是否大于老年代的最大可用空间,若大于则进行一次冒险的Minor GC,因为有可能老年代不能满足空间的需求...原创 2020-02-12 10:56:47 · 167 阅读 · 0 评论 -
简单可达性分析
首先由一系列的GC roots根节点。从 GC Roots 对象作为起点向下搜索,搜索走过的路径成为引用链。当一个对象到 GC Roots 不存在任何引用链时,则证明此对象是不可用的。当对象不可用时,还可通过finalize()方法自救。如下图所示,object 5、object 6、object 7到GC Roots均不存在任何引用链,它们均为不可用的。可作为 GC Roots 的对...原创 2020-02-12 10:56:36 · 416 阅读 · 0 评论 -
从年轻代到老年代执行的时间以及发生转移的场景
1、通过年龄计数器判断一个对象是否需要转移。对象每经过一个GC仍然存活,年龄计数器加一。当年龄超过设定的值,则将其通过担保机制转移到老年代。2、或者动态绑定,当Suvivor中年龄相同的对象数量超过一半,则年龄大于等于该年龄的的对象转移到老年代,无需等待设置的最大年龄值。3、新生成的大对象直接进入老年代。...转载 2020-02-11 14:56:03 · 402 阅读 · 0 评论 -
JVM把哪些对象存放在老年代?
老年代用于存放生命周期较长的对象。所以以下对象会被存放在老年代中:1、长期存活的对象。2、Survivor区放不下的对象。3、新生成的大对象(字符串与数组),即超过了设定的值的对象,直接在老年代中分配。...原创 2020-02-11 10:17:31 · 1719 阅读 · 0 评论 -
JVM垃圾回收算法
垃圾回收算法有:标记清除算法,复制算法,标记整理算法,分代收集算法。1.标记-清除算法:先利用可达性分析算法,标记出存活的对象。标记完之后,再扫描整个空间中未被标记的对象进行回收。 缺点:效率低,会造成大量碎片。2.复制算法:复制算法将空间分为两部分,每次使用其中的一部分。当一块内存用完了,就将这一块所有存活对象复制到另一块,将已使用的块清除。解决了碎片化问题,但会浪费一定的内存空间。适用...原创 2020-02-11 10:12:55 · 73 阅读 · 0 评论 -
JVM垃圾回收机制
JVM中的对象被认定为垃圾的标志是此对象已“死”,判断对象已“死”的方法有:1、引用计数法:当给对象添加一个引用计数器,每当有一个地方引用这个对象时计数器值就+1;引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用,即对象已“死”。引用计数法实现简单,判定效率也比较高,在大部分情况下都是一个比较好的算法。但是,在主流的JVM中没有选用引用计数法来管理内存,最主要...原创 2020-02-11 09:56:33 · 106 阅读 · 0 评论 -
JVM内存布局
JVM中的内存布局主要分为:堆、方法区、虚拟机栈、本地方法栈、程序计数器这五个部分。其中堆和方法区是线程共享,而栈和程序计数器是每个线程都会有自己的分配空间,即线程私有。堆是内存最大的一块,主要存放对象实例和数组。方法区主要存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。虚拟机栈主要存放局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈和虚拟机栈基本一样...原创 2020-02-11 09:56:29 · 69 阅读 · 0 评论