3. 说一下堆栈的区别?物理地址堆的物理地址分配对象是不连续的 。 因此性能慢些 。 在GC的时候也要考虑到不连续的分配 , 所以有各种算法 。 比如 , 标记-消除 , 复制 , 标记-压缩 , 分代(即新生代使用复制算法 , 老年代使用标记——压缩)
栈使用的是数据结构中的栈 , 先进后出的原则 , 物理地址分配是连续的 。 所以性能快 。
内存分别堆因为是不连续的 , 所以分配的内存是在运行期确认的 , 因此大小不固定 。 一般堆大小远远大于栈 。
栈是连续的 , 所以分配的内存大小要在编译期就确认 , 大小是固定的 。
存放的内容堆存放的是对象的实例和数组 。 因此该区更关注的是数据的存储
栈存放:局部变量 , 操作数栈 , 返回结果 。 该区更关注的是程序方法的执行 。
PS:静态变量放在方法区 静态的对象还是放在堆 。 程序的可见度
堆对于整个应用程序都是共享、可见的 。
栈只对于线程是可见的 。 所以也是线程私有 。 他的生命周期和线程相同 。
4. Java内存泄漏内存泄漏是指不再被使用的对象或者变量一直被占据在内存中 。
严格来说 , 只有对象不会再被程序用到了 , 但是GC又不能回收他们的情况 , 才叫内存泄漏 。
理论上来说 , Java是有GC垃圾回收机制的 , 也就是说 , 不再被使用的对象 , 会被GC自动回收掉 , 自动从内存中清除 。
但是 , 即使这样 , Java也还是存在着内存泄漏的情况 , java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露 , 尽管短生命周期对象已经不再需要 , 但是因为长生命周期对象持有它的引用而导致不能被回收 , 这就是java中内存泄露的发生场景 。
5. JVM 有哪些垃圾回收算法?
- 标记-清除算法:标记有用对象 , 然后进行清除回收 。 缺点:效率不高 , 无法清除垃圾碎片 。
- 复制算法:按照容量划分二个大小相等的内存区域 , 当一块用完的时候将活着的对象复制到另一块上 , 然后再把已使用的内存空间一次清理掉 。 缺点:内存使用率不高 , 只有原来的一半 , 消耗内存 。
- 标记-整理算法:标记无用对象 , 让所有存活的对象都向一端移动 , 然后直接清除掉端边界以外的内存 。
- 分代算法:根据对象存活周期的不同将内存划分为几块 , 一般是新生代和老年代 , 新生代基本采用复制算法 , 老年代采用标记整理算法 。
7. 说一下类加载的执行过程?
- 加载:根据查找路径找到相应的 class 文件然后装载入内存中;
在这里插入图片描述
- 验证:检查加载的 class 文件的正确性;
- 准备:给类中的静态变量分配内存空间;
- 解析:虚拟机将常量池中的符号引用替换成直接引用的过程 。 符号引用就理解为一个标示 , 而在直接引用直接指向内存中的地址;
- 初始化:对静态变量和静态代码块执行初始化工作 。
- 当需要加载一个类的时候 , 子类加载器并不会马上去加载 , 而是依次去请求父类加载器加载
- 如果父类加载器还存在其父类加载器 , 则进一步向上委托 , 依次递归 , 请求最终将到达顶层的启动类加载器;
- 华硕|2022上半年轻薄本持续上新,为何我更推荐华硕好屏系列新品?
- 荣耀play|权威认可!这家国产品牌携14个2022 iF设计奖满载而归,实力藏不住
- 华硕灵耀|还没开售就火了!华硕灵耀14 2022有没有实力成为轻薄水桶机?
- 半导体|十维资本姜玮常:聚焦中国新一代科技领袖丨春芽「锌」生演讲实录
- iphone13|都2022年了,现在入手iPhone13会不会太晚
- OPPO Find|2022上半年换新机,有哪些很值得关注的旗舰?这三款不看太吃亏
- 36氪首发|智能服务机器人公司「汉特云」获数千万级Pre-A轮融资,提供室内+室外机器人解决方案
- 本文转自:国际在线2020年开始|2022抖音电商茶行业洞察报告
- 酷睿处理器|轻薄长续航+12代酷睿+2.8K OLED,灵耀14 2022为移动商务而生
- 工业互联网|一图读懂-工业互联网专项工作组2022年工作计划重点解读