07 JVM
Lamiaomiao
好好学习,天天向上
展开
-
13 New一个对象的过程
new一个对象时发生了什么?首先会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。创建对象在堆区分配对象需要的内存:分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量。对所有实例变量赋默认值:将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值。执行实例初始化代码:初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法如果有类似于Cat c = new Cat()形式的c引用的话原创 2020-08-06 11:53:20 · 178 阅读 · 0 评论 -
12 内存溢出的类型及解决思路
jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)Heap space(堆区域)Java Stacks(Java栈)第一种OutOfMemoryError: Permanent Generation space产生原因是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够。解决:增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久代原创 2020-08-12 23:55:54 · 301 阅读 · 0 评论 -
11 内存泄露
1. 内存泄漏怎么引起的?内存泄漏是指无用对象 持续占有内存,内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。2. 内存泄漏的场景?单例模式可能会造成内存泄露。因为单例的静态特性使得它的生命周期和应用的生命周期一样长,如果单例对象拥有另一个对象的引用,那么在整个应用程序的生命周期里这个对象都不能被正常回收,从而导致内存泄露。解决办法是将这个对象改为全局的上下文。ThreadLocal3. 举个内存泄漏的例子?public E pop(){ if(size == 0)原创 2020-08-06 11:50:09 · 237 阅读 · 0 评论 -
10 JVM调优、GC优化
1. JVM调优由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代。实际项目中可以通过 -XX:+PrintGCDetails 来打印查看GC的详细日志,然后根据日志分析新生代空间大小分配是否合理,通过 -Xmn 命令调节新生代的大小,最大限度降低新对象直接进入老年代的情况。虽然大部分情况下,将对象分配在新生代是合理的,但对于大对象,如果首次就在新生代分配,可能会出现新生代空间不足导致很多年龄不够的小对象被分配到老年代,从而破坏了新生代的结构。因此,对于大对象,可以通过原创 2020-08-06 11:49:47 · 138 阅读 · 0 评论 -
09 对象进入堆到被回收的过程
1. 一个对象从进入堆区到死亡的全流程首先创建一个对象,将其放入新生代的eden区域,如果对象太大,就会直接将其分配在老年代中。可以通过参数-XX:PretenureSizeThreshold 设置直接进入老年代的对象大小。现在假设对象被存放在eden区,经过一段时间,这个对象的年龄增加到一定的临界值时,就会晋升到老年代中。可以通过这个参数-XX:MaxTenuringThreshold:设置进入老年代对象的年龄。年龄的计算方式: 虚拟机给每个对象定义了一个对象年龄计数器,对象在Eden出生,经过一次M原创 2020-08-06 11:47:06 · 247 阅读 · 0 评论 -
08 新生代和老年代
1. 新生代和老年代的区别?新生代:一般占据堆的 1/3 空间。用来存放新生的对象,新生代对象朝生夕死,对象存活率低,新生代MinorGC非常频繁,一般回收速度也比较快。新生代常采用 复制算法。老年代:主要存放应用程序中生命周期长的内存对象。老年代对象存活率高。老年代MajorGC经常会伴随至少一次的 MinorGC,老年代MajorGC 的速度比较慢。老年代常采用的 标记-清除算法和标记-整理算法。2. 什么样能够从新生代到达老年代?Eden区满时,进行Minor GC,当Eden和一个Su原创 2020-08-06 11:46:32 · 1481 阅读 · 0 评论 -
07 垃圾收集器
1. Java垃圾收集器有哪些?常见垃圾回收器原理?Serial收集器 & Serial Old收集器:这个组合是Client模式下的默认垃圾收集器。(通过-XX:+UseSerialGC强制开启)serial作用于新生代,采用复制算法。serial old作用于老年代,采用标记整理算法。优点:它们都是单线程收集器,少了多线程切换的开销,相较于其他收集器能够更加专注于垃圾回收,在单核场景下效率极高,在回收较小内存(大概100兆左右)时,停顿时间是毫秒级的。缺点:由于单线程运行,整个GC阶原创 2020-08-06 11:46:00 · 85 阅读 · 0 评论 -
06 垃圾回收算法
1. JVM会在什么时候进行垃圾回收?会在cpu空闲的时候自动进行回收在堆内存存储满了之后主动调用System.gc()后会进行回收2. 如何判断对象已经死了(判断对象可回收)?引用计数法(判断对象的引用数量): 它的基本思想是堆中每个对象实例都有一个引用计数器,每当有一个地方引用它,计数器的值就加1;当引用失效时,计数器的值就减1。计数器值为0的对象实例可以被当做垃圾收集。优点是实现简单,效率也高。缺点是无法检测出循环引用,比如父对象有一个对子对象的引用,子对象反过来又引用父对象,导致它们原创 2020-08-06 11:45:25 · 100 阅读 · 0 评论 -
05 类加载机制
1. 什么是类加载机制?虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。2. 类加载过程?类从加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载 7 个阶段。其中验证、准备和解析3个阶段又被统称为连接。首先将.java文件编译为.class文件,然后Java虚拟机就通过类加载器(类加载器本质就是一段程序)把“.class”文件加载到原创 2020-08-06 11:44:50 · 83 阅读 · 0 评论 -
04 Java的四种引用类型
Java的四种引用类型强引用:在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,例如Cat c=new Cat();这个引用变量就是一个强引用。只要强引用存在,垃圾收集器将永远不会回收被引用的对象。即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之 一。软引用:用来描述非必需对象。当系统内存足够时不会对其回收,在系统将要发生内存溢出异常之前,会对其进行回收。用途: 软引用可用来实现内存敏感的高速缓存,在实际业务中的一个应用是浏览器的后退按原创 2020-08-06 11:44:24 · 102 阅读 · 0 评论 -
03 JVM内存结构
1. JVM是什么JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。2. JVM内存布局详细介绍一下虚拟机栈、本地方法栈、程序计数器(线程私有的)方法区、堆(线程共享的)方法区:被所有线程共享区域,用于存放已被原创 2020-08-06 11:42:21 · 104 阅读 · 0 评论 -
02 堆和栈的区别
栈是线程私有的,堆是线程共享的。它们存储的内容不同:栈存放的是局部变量,局部变量表中存放各种基本数据类型和对象的引用。堆存放的是对象实例。从作用上来说,栈是运行时单位,解决的是程序运行问题,即程序如何执行,如何处理数据。而堆是存储单位,解决的是数据存储问题,即数据怎么放、放在哪。...原创 2020-08-04 10:18:54 · 112 阅读 · 0 评论 -
01 Java内存模型 主内存 工作内存
1. 什么是Java内存模型?(JMM)Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,来实现让 Java 程序在各种平台下都能达到一致的内存访问效果。处理器的读写速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。每个处理器都有自己的高速缓存,而它们又共享同一主内存,可能操作同一位置引起各自缓存不一致,所以还在高速缓存和主内存之间加入了缓存一致性协议。(Volatile可以解决这个问题 )Java 内存模型有三个特性:原子性是指一个操作不可以被中断。可见性是指一原创 2020-08-04 10:17:45 · 134 阅读 · 0 评论