#jvm
yanrongren
这个作者很懒,什么都没留下…
展开
-
判断对象死亡
引用计数法 给对象添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。 目前的主流算法并没有选择这个算法来管理内存,主要的原因是很难解决对象之间相互循环引用的问题。 可达性分析算法 基本思想是通过一系列的GC Roots的对象作为起点,从这些节点开始向下搜索,节点走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的话,则证明此对象是不可用的。 可作为GC Roots的对象 虚拟机栈中引用的对象 本地方法栈中引原创 2021-04-10 17:22:03 · 74 阅读 · 0 评论 -
java字符串
String String,StringBuffer与StringBuilder的区别原创 2021-04-10 16:44:50 · 56 阅读 · 0 评论 -
HotSpot虚拟机在堆中对象分配,布局和访问的过程
对象的创建 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过,解析和初始化过,如果没有,执行相应的类加载过程。 分配内存 在堆中为对象分配内存。 初始化零值 将分配到的内存空间都初始化为零值。 设置对象头 对象头的内容,对象是哪个类的实例,如何能找到类的元数据信息、对象的hash码,对象的GC分代年龄等信息。 执行init方法 把对象按照程序员的意愿进行初始化。 对象的内存布局 分为3块区域:对象头,实原创 2021-04-10 16:12:48 · 104 阅读 · 1 评论 -
jvm运行时数据区
程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环,跳转、异常处理等功能都需要依赖这个计数器来完成。 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称这类内存区域为线程私有的内存。 程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 ja原创 2021-04-10 15:25:22 · 47 阅读 · 0 评论 -
垃圾收集算法与垃圾收集器
垃圾收集算法 标记-清除算法 a、首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。 b、产生的问题,效率问题。空间问题,标记清除后会产生大量不连续的碎片。 标记-复制算法 将内存分为大小相同的两块,每次使用其中的一块。 标记整理算法 根据老年代的特点提出的一种标记算法,标记过程与“标记-清除”一样,但后续步骤不是直接回收垃圾对象,而是将存活对象移动到一端,然后清除存活对象边界外的所有空间。 分代收集算法 a、将堆分为新生代和老年代,根据各个年代的特点选择合适的垃圾收集算法。 b原创 2021-04-11 10:35:53 · 51 阅读 · 0 评论 -
双亲委派机制
类加载器 除了BootstrapClassLoader,其他类加载器均由java实现且全部继承自java.lang.ClassLoader BootstrapClassLoader(启动类加载器):最顶层的加载器类,由c++实现,负责加载%JAVA_HOME%/lib目录下的jar包和类或被-Xbootclasspath参数指定的路径中的所有类。 ExtensionClassLoader(扩展类加载器):主要负责加载目录%JRE_HOME%/lib/ext目录下的类,或被java.ext.dirs系统变量原创 2021-04-11 14:39:41 · 65 阅读 · 0 评论