Java堆内存是线程共享的!面试官:你确定吗?
发布时间:2020-03-14 05:20:21 所属栏目:资源 来源:站长网
导读:Java 作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解。可以说,关于JVM的相关知识,基本是每个Java开发者必学的知识点,也是面试的时候必考的知识点。 在JVM的内存
Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解。可以说,关于JVM的相关知识,基本是每个Java开发者必学的知识点,也是面试的时候必考的知识点。 在JVM的内存结构中,比较常见的两个区域就是堆内存和栈内存(如无特指,本文提到的栈均指的是虚拟机栈),关于堆和栈的区别,很多开发者也是如数家珍,有很多书籍,或者网上的文章大概都是这样介绍的: 1、堆是线程共享的内存区域,栈是线程独享的内存区域。 2、堆中主要存放对象实例,栈中主要存放各种基本数据类型、对象的引用。 但是,作者可以很负责任的告诉大家,以上两个结论均不是完全正确的。 本文首先带大家了解一下为什么我会说“堆是线程共享的内存区域,栈是线程独享的内存区域。”这句话并不完全正确!?关于JVM内存结构的相关知识,大家可以阅读JVM内存结构 VS Java内存模型 VS Java对象模型、万万没想到,JVM内存结构的面试题可以问的这么难?等文章。 在开始进入正题之前,请允许我问一个和这个问题看似没有任何关系的问题:Java对象的内存分配过程是如何保证线程安全的? Java对象的内存分配过程是如何保证线程安全的? 我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,但是无论如何,对象在创建过程中,都需要进行内存分配。 对象的内存分配过程中,主要是对象的引用指向这个内存区域,然后进行初始化操作。 但是,因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,怎么办。![]() ![]() ![]() ![]() (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |