
07 JVM
JVM
喵了个咪的回忆丶
Java后台
展开
-
类加载器,双亲委派模型
1. 对类加载机制的了解?加载顺序, 卸载顺序虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载 7 个阶段。其中验证、准备、解析 3 个部分统称为连接。各个阶段...原创 2019-11-05 15:47:04 · 180 阅读 · 0 评论 -
什么时候进入老年代?
Minor GC 和 Full GC 的含义及区别?Minor GC(新生代GC):指发生在新生代的垃圾收集动作,新生代中的对象朝生夕死,所以 Minor GC 非常频繁,回收速度也比较快。Full GC(老年代GC):指发生在老年代的GC,速度一般比 Minor GC 慢十倍以上。如果有Full,说明这次GC发生了Stop-The-World。什么时候对象进入老年代?大对象直接进入...原创 2019-11-02 16:42:33 · 2195 阅读 · 0 评论 -
3.4 垃圾收集器
垃圾收集器目前常用的有七种垃圾收集器,分别为:① Serial 收集器(复制算法): 它是一个新生代单线程收集器,采用的复制算法,只会使用一条收集线程去完成垃圾收集工作,而且它在进行垃圾收集时,必须暂停其他所有的工作线程。优点是简单高效,没有线程交互的开销。② ParNew 收集器(复制算法): 它是一个新生代收集器,采用的复制算法,可以认为是 Serial 收集器的多线程版本。除...原创 2019-11-01 22:29:04 · 134 阅读 · 0 评论 -
3.3 垃圾收集算法
垃圾收集算法(要说的很清楚,优点,问题,用途,如何实现)标记-清除算法 (Mark-Sweep): 它分为标记和清除两个阶段,首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象。优点: 不需要进行对象的移动,只需要对不存活的对象进行处理,在存活对象比较多的情况下极为高效。缺点: 标记和清除的效率都不高,而且标记清除后会产生大量不连续的内存碎片,空间碎片太多会导致需要分配较...原创 2019-11-01 16:42:51 · 139 阅读 · 0 评论 -
2.1 JVM内存结构
1. 内存区域(运行时数据区)包括线程私有的程序计数器、虚拟机栈、本地方法栈,还有所有线程共享的Java堆和方法区。程序计数器:是当前线程所执行字节码的行号指示器,便于线程切换后能恢复到正确的执行位置。虚拟机栈:生命周期与线程相同,用于存储局部变量。本地方法栈:为虚拟机使用的 Native 方法服务。Java堆:用于存放对象实例。是垃圾收集器管理的主要区域(被称为GC堆),可以细分为新...原创 2019-10-28 20:23:31 · 189 阅读 · 0 评论 -
young GC和Full GC的区别、什么时候触发young gc和Full GC、如何优化GC
什么时候触发young gc?对象优先在新生代 Eden (衣等)区中分配,如果 Eden 区没有足够的空间时,就会触发一次 Young GC 。什么时候会触发Full GC?调用 System.gc() 方法时,会建议JVM进行Full GC,此方法不建议使用。新生代使用的是复制算法,为了内存利用率,只使用其中一个 Survivor 空间来做轮换备份,因此如果大量对象在 Minor GC 后仍然存活,导致 Survivor 空间不够用,就会通过分配担保机制,将多出来的对象提前转到老年代,此时原创 2020-08-20 18:47:38 · 20638 阅读 · 3 评论 -
2.2 JVM中堆和栈的区别
JVM中堆和栈的区别堆和栈(虚拟机栈)是完全不同的两块内存区域,栈是线程私有的,堆是线程共享的。二者之间最大的区别就是存储的内容不同:堆中主要存放对象实例。栈(局部变量表)中主要存放各种基本数据类型和对象的引用。从作用上来说,栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,如何处理数据。堆解决的是数据存储问题,即数据怎么放、放在哪。在Java 中每个线程都会有一...原创 2019-11-01 14:39:37 · 338 阅读 · 1 评论 -
新生代、老年代、永久代(元空间)
新生代和老年代jvm中的堆分为新生代和老年代。新生代用来存放新生的对象,新生代中的对象朝生夕死,所以会频繁的触发 minor (脉了)GC 进行垃圾回收。新生代分为 eden 区、survivor from 区和 survivor to 区。eden区是java新对象的出生地,如果新创建的对象占用内存很大的话就会直接分配到老年代。当eden区的内存不足时就会触发 minor gc 对新生代进行一次垃圾回收。survivor from 区存放的是上一次minor gc 的幸存者,它将作为这一次gc的被扫原创 2020-07-15 16:15:17 · 1118 阅读 · 0 评论 -
内存溢出和内存泄漏的区别
什么是内存泄漏?内存泄漏是指无用对象持续占有内存,从而造成内存空间的浪费称为内存泄漏。内存泄漏的场景?单例模式可能会造成内存泄露。因为单例的静态特性使得它的生命周期和应用的生命周期一样长,如果单例对象拥有另一个对象的引用,那么在整个应用程序的生命周期里这个对象都不能被正常回收,从而导致内存泄露。解决办法是将这个对象改为全局的上下文。ThreadLocal如何避免或解决内存泄漏?尽...原创 2019-11-27 22:34:40 · 183 阅读 · 0 评论 -
3.2 谈谈对 Java 中引用的了解?(简述强软弱虚四种引用)
简述强、软、弱、虚四种引用强引用: 指在程序代码中普遍存在的,类似 Object o = new Object() 的这类引用,只要强引用存在,垃圾收集器将永远不会回收被引用的对象。软引用: 用来描述非必需对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。软引用可用来实现内存敏感的...原创 2019-11-01 15:44:56 · 412 阅读 · 0 评论 -
3.1 判断垃圾可以回收的方法有哪些?如何判断对象是否死亡?
判断垃圾可以回收的方法有哪些?引用计数法: 它的基本思想是堆中每个对象实例都有一个引用计数器,每当有一个地方引用它,计数器的值就加1;当引用失效时,计数器的值就减1。计数器值为0的对象实例可以被当做垃圾收集。优点是实现简单,效率也高。缺点是无法检测出循环引用,比如父对象有一个对子对象的引用,子对象反过来又引用父对象,导致它们的引用计数永远不为 0,于是引用计数算法无法通知GC收集器回收它们。...原创 2019-11-01 15:07:25 · 712 阅读 · 0 评论 -
2.3 New一个对象的过程
new一个对象时发生了什么?流程首先会检查这个new指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,那必须先执行相应的类加载过程。类加载检查通过后,虚拟机将为新生对象分配内存,有两种分配方式:①指针碰撞:指的是如果Java堆中内存是绝对规整的,用过的内存放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器...原创 2019-11-01 14:44:11 · 162 阅读 · 0 评论 -
12.1 Java内存模型,主内存和工作内存
什么是Java内存模型?(JMM)因为处理器和内存不是同数量级,所以需要在中间建立中间层,也就是高速缓存,这会引出缓存一致性问题。在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存,有可能操作同一位置引起各自缓存不一致,所以需要约定协议来保证一致性。Java 内存模型(Java Memory Model,JMM) 屏蔽掉了各种硬件和操作系统的内存访问差异,以实现让 Java...原创 2019-11-06 20:52:29 · 439 阅读 · 0 评论 -
JVM监控工具、常用参数、JVM调优
说下你用过的 JVM 监控工具?jps :查看所有的 Java 进程jinfo:显示虚拟机配置信息jstack:堆栈跟踪工具,一般用于查看某个进程包含线程的情况。JVM常用参数-Xms :指定初始堆的大小-Xmx :指定最大堆的大小-Xmn :指定新生代的大小-Xss :指定每个线程的堆栈大小-XX:+PrintGCDetails:打印GC的详细日志-XX:Pretenur...原创 2019-11-27 19:36:08 · 145 阅读 · 0 评论 -
说说你理解的JVM、JDK/JRE/JVM的关系
JVM是什么?为什么Java被称作是“平台无关的编程语言”(Java跨平台性)?JVM是一个虚构出来的计算机,它是通过在实际的计算机上模拟各种计算机功能来实现的。 屏蔽了不同操作系统之间的差异,使Java程序只需要生成在虚拟机上运行的字节码,就可以在多种平台上运行,从而实现了跨平台性,具体是将 Java 源文件通过 Javac 编译器编译成二进制的 .class 文件,然后各个平台上所装有的...原创 2020-04-23 15:56:29 · 193 阅读 · 0 评论