
JVM
ThunderWay
北京工业大学计算机研究生就读
展开
-
堆内存中对象分配的基本策略?
堆空间的基本结构:上图所示的eden区、s0区、s1区都属于新生代,tentired区属于老年代。对象会先在eden区域分配,在一次新生代垃圾回收之后,如果对象还存活,会进入s0和s1区域,并且对象的年龄还会加一,当对象年龄增加到一定程度,就会晋升到老年代中。大对象和长期存活的对象会直接进入老年代。...原创 2020-10-19 20:36:43 · 470 阅读 · 0 评论 -
Minor GC和Full GC有什么不同?
大多数情况下,对象在新生代中eden区域分配,当eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。新生代GC(Minor GC):指发生在新生代的垃圾回收动作,Minor GC非常频繁,回收速度比较快。老年代GC(Major GC/Full GC):指发生在老年代的垃圾回收动作,出现了Major GC通常会伴随一次Minor GC,Major GC的速度比Minor GC的慢10倍以上。...原创 2020-08-19 21:34:33 · 373 阅读 · 0 评论 -
描述一下常见的垃圾回收器
一般就七种垃圾收集器:Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old、 CMS、G1。Serial收集器:单线程的收集器,在垃圾回收的时候必须停止其他所有的工作线程,垃圾收集效率高,年轻代采用复制算法。Serial Old收集器:单线程、效率高、发生在serial的老年代区域,采用标记-整理算法。ParNew收集器:Serial收集器的多线程版本,多条线程垃圾回收,其他与Serial相同,只有ParNew收集器可以与CMS收集器配合原创 2020-08-13 15:24:33 · 188 阅读 · 0 评论 -
如何判断一个类是无用的类?如何判断一个常量是废弃常量
方法区主要回收无用的类。1. 这个类的实例被回收了,java堆中没有任何这个类的实例。2. 这个类的ClassLoader被回收了。3. 这个类的.class对象没有在任何地方被引用,无法在任何地方通过反射访问这个类的方法。...原创 2020-08-10 16:08:18 · 411 阅读 · 0 评论 -
JVM(java)如何判断对象是否死亡?
虚拟机回收对象之前首先要判断对象是否死亡,两种方法:引用计数器法和可达性分析算法。引用计数器法:给对象添加一个引用计数器,每当有一个地方引用它,计数器就加1,当引用失效时,计数器就减1,任何时刻当计数器为0的时候,这个对象就不能再被使用了。优点:实现简单效率高。缺点:主流jvm不使用这个算法,因为无法解决对象循环引用的问题。可达性分析算法:首先有一系列的“GC roots”根节点,从根节点向下搜索,走过的路径叫做引用链,当一个对象到GC root没有任何引用链的时候,证明对象是不可活的(就是这个对象原创 2020-08-07 12:09:52 · 721 阅读 · 0 评论 -
HotSpot为什么要分年轻代和老年代
因为有的对象寿命长,有的对象寿命短,应该将寿命长的对象放在一个区域,寿命短的放在一个区域,进行不同层次的GC,寿命短的叫年轻代GC(minor GC),频率比较快,寿命长的叫老年代GC(Major GC)。堆中放的就是对象实例,就是new出来的都放堆里,堆又划分为年轻代和老年代,年轻代又分为一个eden和两个survivor。...原创 2020-08-07 11:16:58 · 547 阅读 · 0 评论 -
叙述一下常见的GC算法?
1. 标记清除算法:将所有需要回收的对象进行标记,标记结束以后对标记的对象进行回收,但是效率低,会造成大量碎片。2. 复制算法:复制算法将空间分为两部分,每次只使用一部分。当一块空间用完了,就将这块还存活的对象复制到另一块,将已使用的快全部清除,这样不会产生碎片,但会浪费一部分内存空间。在堆中的年轻代使用这个算法,因为年轻代的对象生命周期比较短。年轻代将内存分为一个eden,两个survivor,每次使用一个eden和一个survivor,回收的时候,将eden和survivor中的对象复制到另一个su原创 2020-08-05 17:35:30 · 235 阅读 · 0 评论 -
介绍一下java的引用?
1. 强引用:new一个对象就是强引用,例如Object o = new Object()就是一个强引用,只要强引用存在,垃圾回收器就永远不会回收掉此类对象。2. 软引用:还有用但是不算必须的对象。在内存即将溢出的时候,会把这些对象加入回收范围进行二次垃圾回收。如果回收之后还是没有足够的内存空间,才会发生内存溢出异常。软引用一般用来实现内存敏感的缓存,如果空闲内存,就可以保留缓存,当内存不够的时候,就清理掉这个缓存,这样保证使用缓存的同时也不会耗尽内存。3. 弱引用:描述非必须的对象,被弱引用关联的原创 2020-08-05 12:08:00 · 116 阅读 · 0 评论 -
对象的访问定位
对象的访问定位主要两种,句柄访问和直接指针。java程序需要栈上的引用来操作堆上的数据。句柄访问:java堆中开辟一块句柄池,用来存放对象实例的指针,栈中的引用指向句柄地址,如果对象实例改变,引用不变。直接指针:引用指向的直接就是对象的地址。...原创 2020-08-04 17:28:53 · 190 阅读 · 0 评论 -
对象的内存布局
在HotSpot虚拟机中,对象的内存布局分为三部分:对象头、实例数据和对齐填充。对象头:主要包括两部分,运行时的数据和类型指针。一部分用于对象运行时的数据信息,如哈希码、GC分代年龄、锁状态信息等;另一部分是指向它的类的元数据信息的指针,虚拟机通过这个指针来确定对象是哪个类的实例。实例数据:是对象真正存储的有效的数据,像字段信息这种对齐填充。...原创 2020-08-04 17:18:20 · 94 阅读 · 0 评论 -
java对象的创建过程?
1. 判断类是否被加载。jvm遇到一条new指令的时候,先检查这个指令的参数是不是能够在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载和初始化过。如果没有,就必须先执行相应的类加载的过程。2. 对象分配内存(指针碰撞或空闲链表)。对象所需要的内存在类加载完成后就已经确定,为对象分配内存空间相当于从把一块固定大小的内存从java堆中划分出来。指针碰撞:java堆中内存是工整的,所有用过的内存放在一边,没用过的放在一边,中间放着指针作为分界点的指示器,分配内存也就是将指针往空闲空原创 2020-08-03 17:45:48 · 100 阅读 · 0 评论 -
简述一下jvm(java)内存区域
jvm将内存区域(运行时的数据区)分为五个部分:元空间、堆、虚拟机栈、本地方法栈和程序计数器。程序计数器:是当前线程在执行的字节码的行号指示器,是线程私有的,每个线程都有一个程序计数器,线程之间的程序计数器是相互独立互不干扰的。这个程序计数器这个区域是java虚拟机规范中唯一没有OOM(OutOfMemoryError)情况的区域。虚拟机栈:也是线程私有的,生命周期和线程相同。虚拟机栈描述的就是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧存放局部变量表、操作数栈、动态链接、方法返原创 2020-08-02 17:58:36 · 267 阅读 · 0 评论