Java面试:Java 内存分配与回收策略及Java死锁

天天见闻 天天见闻 2023-10-05 德国汽车 阅读: 63
摘要: 概述java内存分配和回收策略以及Minor GC和Major GC(Full GC)。 内存分配 堆栈区域:堆栈分为java虚拟堆栈和本地方法堆栈。 堆空间:堆由所有线程共享,在虚拟机启动时创建并唯一存储对象实例。堆区域是gc的主要区域,通常分为两个块年轻一代和老龄一代。更细的年轻一代分为Eden领域,主要放置新建对象,From survivor和To survivor保存gc幸运保存的对象,默认情况下分别占8:1:1。

简述 java 内存分配与回收策略以及 Minor GC 和Major GC (full GC)

内存分配

栈区: 栈分为 java 虚拟机栈和本地方法栈

堆区: 堆被所有线程共享区域, 在虚拟机启动时创建, 唯一 目的存放对象实例 。堆 区是 gc 的主要区域, 通常情况下分为两个区块年轻代和年老代 。更细一点年轻代 又分为 Eden 区, 主要放新创建对象, From survivor 和 To survivor 保存 gc 后幸 存下的对象, 默认情况下各自占比 8:1:1。

方法区: 被所有线程共享区域, 用于存放已被虚拟机加载的类信息, 常量, 静态变 量等数据 。被 Java 虚拟机描述为堆的一个逻辑部分 。习惯是也叫它永久代 (permanment generation)

程序计数器: 当前线程所执行的行号指示器 。通过改变计数器的值来确定下一条指 令, 比如循环, 分支, 跳转, 异常处理, 线程恢复等都是依赖计数器来完成 。线程 私有的 。

回收策略以及 Minor GC 和 Major GC

● 对象优先在堆的 Eden 区分配

● 大对象直接进入老年代

● 长期存活的对象将直接进入老年代

当 Eden 区没有足够的空间进行分配时, 虚拟机会执行一次 Minor GC.Minor GC 通常 发生在新生代的 Eden 区, 在这个区的对象生存期短, 往往发生 GC 的频率较高, 回 收速度比较快;Full Gc/Major GC 发生在老年代, 一般情况下, 触发老年代 GC 的时候 不会触发 Minor GC,但是通过配置, 可以在 Full GC 之前进行一次 Minor GC 这样可以 加快老年代的回收速度 。

如何查看 java 死锁

private static final String lock1 = "lock1";

private static final String lock2 = "lock2";

public static void main(String[] args) {

Thread thread1 = new Thread( - {

while (true) {

synchronized (lock1) {

try {

System.out.println(Thread.currentThread.getName + lock1);

Thread.sleep(1000);

synchronized (lock2){

System.out.println(Thread.currentThread.getName +

lock2);

} catch (InterruptedException e) {

throw new RuntimeException(e);

Thread thread2 = new Thread( - {

while (true) {

synchronized (lock2) {

try {

System.out.println(Thread.currentThread.getName + lock2);

Thread.sleep(1000);

synchronized (lock1){

System.out.println(Thread.currentThread.getName + lock1);

} catch (InterruptedException e) {

throw new RuntimeException(e);

死锁代码演示

1. 程序运行, 进程没有停止。

2. 通过 jps 查看 java 进程, 找到没有停止的进程

3. 通过 jstack 9060 查看进程具体执行信息

Java 死锁如何避免

造成死锁的几个原因

(1) 一个资源每次只能被一个线程使用

(2) 一个线程在阻塞等待某个资源时, 不释放已占有资源

(3) 一个线程已经获得的资源, 在未使用完之前, 不能被强行剥夺

(4) 若干线程形成头尾相接的循环等待资源关系

这是造成死锁必须要达到的 4 个条件, 如果要避免死锁, 只需要不满足其中某一个条 件即可 。而其中前 3 个条件是作为锁要符合的条件, 所以要避免死锁就需要打破第 4 个条件, 不出现循环等待锁的关系 。

在开发过程中

1.要注意加锁顺序, 保证每个线程按同样的顺序进行加锁

2.要注意加锁时限, 可以针对锁设置一个超时时间

3.要注意死锁检查, 这是一种预防机制, 确保在第一时间发现死锁并进行解决

其他相关
电脑配置推荐高性价比 电脑配置推荐

电脑配置推荐高性价比 电脑配置推荐

作者: 天天见闻 时间:2024-03-21 阅读: 32
最新的电脑配置推荐配置推荐:CPU:12代酷睿i5- 12400F散热:利民AX120主板:微星B660M-B内存:金士顿 -野兽-3200-16G固态:金士顿nv2 500G M.2一299显卡:影驰 GTX 1660S电源:影驰500W机箱:玩嘉 流光 合计:4300左右CPU:12代酷睿i5 -12400……...
常用语言的线程模型(Java、go、C++、python3) | 京东云技术团队

常用语言的线程模型(Java、go、C++、python3) | 京东云技术团队

作者: 天天见闻 时间:2023-10-17 阅读: 58
背景知识软件如何驱动硬件?硬件需要相关的驱动程序才能运行,驱动程序安装在操作系统内核中。编写一个程序A后,A程序要操作硬件操作,首先需要进行系统调用,然后内核寻找相应的驱动程序来驱动硬件。驱动程序如何运行硬件?驱动程序作为硬件和操作系统之间的媒介,可以将与操作系统相关的命令翻译成硬件能够识别的电信号,同时,驱动程序还可以将硬件电信号转换为操作系统可以识别的命令。进程、轻量级进程、线程关系由于一个进程执行的空间不同,它被分为内核线程和用户进程,所有这些都称为内核线程,因为它没有虚拟地址空间。当创建一个新的用户进程时,分配一个新的虚拟地址空间,其中不同用户进程之间的资源被分离。创建新流程需要耗费大量资源,而且流程之间切换的成本也很高,因此引入了轻型流程。轻量化在本质上也是对内核线程的上层是抽象的,可以在不同的轻量级进程之间共享一些资源,但是由于轻量级进程本质上是内核线程,所以进行轻量级线程之间的切换需要进行系统调用,成本也很昂贵。内核本质上只能感知进程的存在,就像不同语言的多线程技术一样,是基于用户进程创建的线程库,线程本身不是参与处理器竞争,而是其所属的用户进程参与处理器的竞争。...
Java培训:Java 20中的新特性

Java培训:Java 20中的新特性

作者: 天天见闻 时间:2023-10-08 阅读: 70
Java20版本正式指定了七个关键特性,包括虚拟线程、矢量API建议、结构化并发、作用阈值、外部函数和内存API、记录模式以及switch语句和表达式的模式匹配。想要学习Java技术的学生,可以参加Java训练,考虑全面系统的理论知识和实操项目的学习,以便你快速学习。 1。虚拟线程 虚拟线程是结构化并发的先决条件,自JDK19首次预览以来,已经进行了一些修改。这些更改包括API的一些调整以及ThreadGroup的持久性退化。当它们进入第二预览阶段时,这些轻量级线程旨在简化具有高吞吐量要求的同时应用程序的开发和维护。Oracle相信,这种扩展将带来Java应用程序扩展方式的重大变化。自JDK 19初始预览版以来的更新涉及少量API更改(目前在JDK 19中是持久的)和ThreadGroup降级(现在在JDK 19中也是持久的)。...
什么是线程?

什么是线程?

作者: 天天见闻 时间:2023-09-26 阅读: 70
帖子是什么?线程是操作系统能够进行运算调度的最小单位,也称为轻量级进程,是进程的执行单位。在多任务处理中,线程是用户进程的一个例子,它包含一组独立的执行单元,这些执行单元称为线程。每个线程都有自己的堆栈、堆栈以及执行上下文,彼此通过共享内存进行通信。线程可以分为单线程、多线程、线程池等不同类型。单线程意味着程序只有一条执行线…...
Windows8.1系统安装xp虚拟机的方法

Windows8.1系统安装xp虚拟机的方法

作者: 天天见闻 时间:2023-08-25 阅读: 94
虚拟机是指在具有通过软件模拟的完整硬件系统功能的完全隔离环境中运行的完全计算机系统,因为windows8.1系统用户希望安装xp虚拟机,说明Windows8.1系统如何安装xp虚拟机.4。点击新建虚拟机“5,将xp系统的镜像文件报告给虚拟机的光驱动器”找到xp系统的镜像文件,11.在虚拟机中第一次打开分区的工具“必须格式化主分区...
AMD新一代线程撕裂者再展锋芒:96核心192线程

AMD新一代线程撕裂者再展锋芒:96核心192线程

作者: 天天见闻 时间:2023-07-14 阅读: 84
AMD在高端发烧友领域独占鳌头,其锐龙线程裂裂者系列无法压制Intel,Zen3架构破裂者5000系列已经拥有64核128线程、8通道DDR4和128条PCIe 4.0,而Intel在核心和性能上略逊色;AMD在第三季度发布了Zen4架构的线程撕裂者7000系列,AMD官方的OPN产品清单已经表明,下一代线程撕裂者的顶级型号至少有两种。...
我来说两句

年度爆文