Java知识点

本文详细介绍了JVM内存模型的各个组成部分,包括静态方法区、方法栈和堆。重点讲解了堆的划分,如新生代与老年代比例、Eden区与Survivor区的作用及垃圾回收机制。此外,还探讨了不同区域的垃圾回收策略及其意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM内存模型

链接
静态方法区:全局、静态变量。
方法栈:程序指令以及局部变量表。
堆:所有线程共享,存放对象实例。

静态方法区

静态方法区,又称为永久代(Perm Generation)。它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

堆可以划分为新生代和老年代。
新生代又可以划分为一个Eden区和两个Survivor(幸存)区。
按照规定,新对象会首先分配在Eden中(如果对象过大,比如大数组,将会直接放到老年代)。在GC中,Eden中的对象会被移动到survivor中,直至对象满足一定的年纪(定义为熬过minor GC的次数),会被移动到老年代。
这里写图片描述
新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 。
默认的,Eden : from : to = 8 : 1 : 1 ,即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。

垃圾回收(GC)

链接

垃圾回收的意义

垃圾回收的出现解放了C++中手工对内存进行管理的大量繁杂工作,手工malloc,free不仅增加程序复杂度,还增加了bug数量。
分代收集。即在新生代和老生代使用不同的收集方式。
在垃圾收集上,目标主要有:
加大系统吞吐量(减少总垃圾收集的资源消耗);
减少最大STW(Stop-The-World)时间;
减少总STW时间。

可达性检测

引用计数

其主要思想就是维护一个counter,当counter为0的时候认为对象没有引用,可以被回收。缺点是无法处理循环引用。在当前的JVM中应该是没有被使用的。

根搜算法

思想是从gc root根据引用关系来遍历整个堆并作标记,称之为mark,等会在具体收集器中介绍并行标记和单线程标记。之后回收掉未被mark的对象,好处是解决了循环依赖这种『孤岛效应』。这里的gc root主要指:

a.虚拟机栈(栈桢中的本地变量表)中的引用的对象
b.方法区中的类静态属性引用的对象
c.方法区中的常量引用的对象
d.本地方法栈中JNI的引用的对象

回收策略

复制

主要用在新生代的回收上,通过from区和to区的来回拷贝。需要特定的结构(也就是Young区现在的结构)来支持,对于新生成的对象来说,频繁的去复制可以最快地找到那些不用的对象并回收掉空间。所以说在JVM里YGC一定承担了最大量的垃圾清除任务。

标记清除/标记整理

主要用在老年代回收上,通过根搜的标记然后清除或者整理掉不需要的对象。

进入老年代的条件

  • 存活对象过多。在s1和s2都已经溢出了。如果从eden迁往survior区时,发现放不下,则直接进入 old Gen
  • 从eden到s区来回拷贝次数达到一定的数量,总没有回收掉,进入old区。(从eden到survior1迁到,引用持有中,s1中放不下新迁对象,则清理s1,存活对象,晋升入s2;再下次或继续迁移,就把s2中的。准备说,可能是,这些个对象从s1<->s2来回拷贝一定次数后,会进入old Gen)。这块Servivor Space 调整合适的存活次数 Threshold 通过-XX:MaxTenuringThreshold。但也只是一个建议,最终仍由虚拟机决定

复制和标记清除/整理的区别

为什么新生代要用复制?因为对新生代来讲,一次垃圾收集要回收掉绝大部分对象,我们通过冗余空间的办法来加速整理过程(不冗余空间的整理操作要做swap,而冗余只需要做move)。同时可以记录下每个对象的『年龄』从而优化『晋升』操作使得中年对象不被错误放到老年代。
而反过来老年代偏稳定,我们哪怕是用清除,也不会产生太多的碎片,并且整理的代价也并不会太大。

Java常见面试题和答案

链接

链接

链接

HashMap和Hashtable的区别

都实现了Map接口。
HashMap 类没有分类或者排序,它允许一个 null 键和多个 null 值,而且是不是线程安全的。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。
最大的区别是:HashMap不是线程安全的,而Hashtable是同步/线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值