java内存模型面试回答(内存面试题)

今天给各位分享java内存模型面试回答的知识,其中也会对内存面试题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、java中虚拟机的内存到底分为几类呢,网上说法挺多,能不能给个专业的2、请问两年半的JAVA程序员面试会遇到哪些问题3、库俪能问什么问题4、再有人问你Java内存模型是什么,就把这篇文

java中虚拟机的内存到底分为几类呢,网上说法挺多,能不能给个专业的

Java内存模型

主内存与工作内存

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。

Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示

这里的主内存、工作内存与Java内存区域的Java堆、栈、方法区不是同一层次内存划分。

内存间交互操作

关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成:

· lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。

· unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

· read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

· load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。

· use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

· assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

· store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。

· write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

如果要把一个变量从主内存中复制到工作内存,就需要按顺寻地执行read和load操作,如果把变量从工作内存中同步回主内存中,就要按顺序地执行store和write操作。Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行。也就是read和load之间,store和write之间是可以插入其他指令的,如对主内存中的变量a、b进行访问时,可能的顺序是read a,read b,load b, load a。Java内存模型还规定了在执行上述八种基本操作时,必须满足如下规则:

· 不允许read和load、store和write操作之一单独出现

· 不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中。

· 不允许一个线程无原因地(没有发生过任何assign操作)把数据从工作内存同步回主内存中。

· 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。即就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。

· 一个变量在同一时刻只允许一条线程对其进行lock操作,lock和unlock必须成对出现

· 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值

· 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量。

· 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)。

重排序

在执行程序时为了提高性能,编译器和处理器经常会对指令进行重排序。重排序分成三种类型:

编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。

指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

从Java源代码到最终实际执行的指令序列,会经过下面三种重排序:

为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。Java内存模型把内存屏障分为LoadLoad、LoadStore、StoreLoad和StoreStore四种:

同步机制

介绍volatile、synchronized和final

原子性、可见性与有序性

Java内存模型JMM解决了可见性和有序性的问题,而锁解决了原子性的问题。

可见性

指的是一个线程对变量的写操作对其他线程后续的读操作可见。由于现代CPU都有多级缓存,CPU的操作都是基于高速缓存的,而线程通信是基于内存的,这中间有一个Gap,可见性的关键还是在对变量的写操作之后能够在某个时间点显示地写回到主内存,这样其他线程就能从主内存中看到最新的写的值。volatile,synchronized(隐式锁), 显式锁,原子变量这些同步手段都可以保证可见性。

可见性底层的实现是通过加内存屏障实现的:

1. 写变量后加写屏障,保证CPU写缓冲区的值强制刷新回主内存

2. 读变量之前加读屏障,使缓存失效,从而强制从主内存读取变量最新值

写volatile变量 = 进入锁

读volatile变量 = 释放锁

有序性

指的是数据不相关的变量在并发的情况下,实际执行的结果和单线程的执行结果是一样的,不会因为重排序的问题导致结果不可预知。volatile, final, synchronized,显式锁都可以保证有序性。

有序性的语意有几层,

1. 最常见的就是保证多线程执行的串行顺序

2. 防止重排序引起的问题

3. 程序执行的先后顺序,比如JMM定义的一些Happens-before规则

重排序

的问题是一个单独的主题,常见的重排序有3个层面:

1. 编译级别的重排序,比如编译器的优化

2. 指令级重排序,比如CPU指令执行的重排序

3. 内存系统的重排序,比如缓存和读写缓冲区导致的重排序

原子性

是指某个(些)操作在语意上是原子的。比如读操作,写操作,CAS(compareand set)操作在机器指令级别是原子的,又比如一些复合操作在语义上也是原子的,如先检查后操作if(xxx== null){}

有个专有名词竞态条件来描述原子性的问题。

竞态条件(racing condition)是指某个操作由于不同的执行时序而出现不同的结果,比如先检查后操作。

volatile变量只保证了可见性,不保证原子性,比如a++这种操作在编译后实际是多条语句,比如先读a的值,再加1操作,再写操作,执行了3个原子操作,如果并发情况下,另外一个线程很有可能读到了中间状态,从而导致程序语意上的不正确。所以a++实际是一个复合操作。

加锁可以保证复合语句的原子性,sychronized可以保证多条语句在synchronized块中语意上是原子的。

显式锁保证临界区的原子性。

原子变量也封装了对变量的原子操作。

非阻塞容器也提供了原子操作的接口,比如putIfAbsent。

java内存模型面试回答(内存面试题)

请问两年半的JAVA程序员面试会遇到哪些问题

J2SE基础:

1. 九种基本数据类型的大小,以及他们的封装类。

2. Switch能否用string做参数?

3. equals与==的区别。

4. Object有哪些公用方法?

5. Java的四种引用,强弱软虚,用到的场景。

6. Hashcode的作用。

7. ArrayList、LinkedList、Vector的区别。

8. String、StringBuffer与StringBuilder的区别。

9. Map、Set、List、Queue、Stack的特点与用法。

10. HashMap和HashTable的区别。

11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

12. TreeMap、HashMap、LindedHashMap的区别。

13. Collection包结构,与Collections的区别。

14. try catch finally,try里有return,finally还执行么?

15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

16. Java面向对象的三个特征与含义。

17. Override和Overload的含义去区别。

18. Interface与abstract类的区别。

19. Static class 与non static class的区别。

20. java多态的实现原理。

21. 实现多线程的两种方法:Thread与Runable。

22. 线程同步的方法:sychronized、lock、reentrantLock等。

23. 锁的等级:方法锁、对象锁、类锁。

24. 写出生产者消费者模式。

25. ThreadLocal的设计理念与作用。

26. ThreadPool用法与优势。

27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

28. wait()和sleep()的区别。

29. foreach与正常for循环效率对比。

30. Java IO与NIO。

31. 反射的作用于原理。

32. 泛型常用特点,ListString能否转为ListObject。

33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

34. Java与C++对比。

35. Java1.7与1.8新特性。

36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

37. JNI的使用。

JVM:

1. 内存模型以及分区,需要详细到每个区放什么。

2. 堆里面的分区:Eden,survival from to,老年代,各自的特点。

3. 对象创建方法,对象的内存分配,对象的访问定位。

4. GC的两种判定方法:引用计数与引用链。

5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

6. GC收集器有哪些?CMS收集器与G1收集器的特点。

7. Minor GC与Full GC分别在什么时候发生?

8. 几种常用的内存调试工具:jmap、jstack、jconsole。

9. 类加载的五个过程:加载、验证、准备、解析、初始化。

10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。

11. 分派:静态分派与动态分派。

(来源:面试心得与总结—BAT、网易、蘑菇街)

总体来说java考察内容包括以下这些:

1,面向对象的一些基本概念:继承,多态之类的

2, 抽象类和接口

3, 静态类,内部类

4, Java集合类,同步和非同步

5, Java类加载机制

6, Java内存模型和垃圾回收算法

7, 线程同步机制(voliate,synchronized,重入锁,threadlocal),线程间通信(wait,notify)

8, 异常处理

9, 多线程同步问题,生产者消费者,读者写者,哲学家就餐,用java实现

10, 了解java中设计模式的思想,用了哪些设计模式,有什么好处

作者:Doing

链接:

来源:知乎

库俪能问什么问题

库俪能问什么问题

以下所有问题的答案可以参考(大部分都能找到):JavaGuide(「Java 学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!)。

花了半个月写的最新版 Java学习路线已近更新!可能是你看过最用心、最全面的 Java 后端学习路线。

Java 学习线路图是怎样的?

Java

基础

Java 中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?

String、 StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

== 与 equals?hashCode 与 equals ?

Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

谈谈对 Java 注解的理解,解决了什么问题?

Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?

内部类了解吗?匿名内部类了解吗?

BIO,NIO,AIO 有什么区别?

Java 集合框架

说说 List,Set,Map 三者的区别?三者底层的数据结构?

有哪些集合是线程不安全的?怎么解决呢?

比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同

HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别?HashMap 和 TreeMap 区别?

HashMap 的底层实现

HashMap 的长度为什么是 2 的幂次方

ConcurrentHashMap 和 Hashtable 的区别?

ConcurrentHashMap 线程安全的具体实现方式/底层具体实现

jvm

jvm 内存结构

jvm 调优参数

什么是类加载?何时类加载?类加载流程?

知道哪些类加载器。类加载器之间的关系?

类加载器的双亲委派了解么?结合 Tomcat 说一下双亲委派(Tomcat 如何打破双亲委托机制?…)。

为什么需要双亲委派

Java 内存模型

栈中存放什么数据,堆中呢?

大对象放在哪个内存区域

堆区如何分类

垃圾回收有哪些算法

GC 的全流程

GC 中老年代用什么回收方法?

多线程

线程和进程的区别。

什么是上下文切换?

什么是线程死锁?如何避免死锁?

乐观锁和悲观锁了解么?

说说 sleep() 方法和 wait() 方法区别和共同点?

Java 线程池有哪些参数?阻塞队列有几种?拒绝策略有几种?新线程添加的流程?

实现 Runnable 接口和 Callable 接口的区别。

讲一下 JMM(Java 内存模型)。volatile关键字解决了什么问题?说说synchronized关键字和volatile关键字的区别。

AQS 原理了解么?AQS 组件有哪些?

用过 CountDownLatch 么?什么场景下用的?

再有人问你Java内存模型是什么,就把这篇文

你说的应该是主存和工作内存吧,主存是公共空间,基本可以类比为虚拟机模型中的堆,对象创建好了都是在主存里,所有线程都可以访问,工作内存是线程的私有内存,只有本线程可以访问,如果线程要操作主存中的某个对象,必须从主存中拷贝到工作内存,在对工作内存中的副本进行操作,操作后再写入主存,而不能对主存的对象直接操作

java内存模型面试回答的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于内存面试题、java内存模型面试回答的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月29日 21:47:31
下一篇 2024年3月29日 21:55:55

相关推荐

  • 包含linux内核二进制在内存分布的词条

    内存管理:一文读懂Linux内存组织结构及页面布局 (1)Linux虚拟内存实现机制 Linux虚拟内存的实现需要六种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制、内存共享机制。 Linux 内存管理是操作系统内核对物理内存的分配和管理。Linux 内存管理有两个基本任务:一是把可用的内存给程序使用,二是在物理内存不足时,…

    2024年5月23日
    4400
  • java应届面试,java应届生面试题

    Java面试中需要注意哪些细节问题? 1、在Java面试中,很大程度上,你能不能赢得Java面试官的芳心,就看你跟他交谈的过程,在交谈中,你需要注意,礼貌用语,声音的大小要控制好,太大感觉有人在跟你吵架,大小感觉你本人没有自信心。 2、简要介绍Java程序的健壮性。 Java程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对干类型的…

    2024年5月23日
    4100
  • linux内核面试,Linux内核面试题

    linux认证的面试题及答案 1 * * * /bin/sh /usr/bin/fileback 有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?参考答案:(1)第一种方法:用户应使用crontab e 命令创建crontab文件。 iptables是否支持time时间控制用户行为,如有请写出具体操作步骤。…

    2024年5月23日
    4100
  • linux服务器内存,linux服务器内存不足怎么解决

    Linux服务器如何查看CPU占用率、内存占用、带宽占用 1、查看cpu总个数方法:首先执行top命令,如下图中内容所表示。在top命令的显示界面,按数字键1,即可查看到当前系统中的总cpu数,如下图中内容所表示。 2、在电脑中进入Linux操作系统,打开Linux命令界面。在Linux命令界面中输入cat /proc/meminfo命令后,敲击键键盘回车键…

    2024年5月23日
    3800
  • 内存库java,内存库是什么

    java编程内存管理需要注意的问题? 1、所以可以节省大量内存。相信如果Java规范直接把Boolean的构造函数规定成private,就再也不会出现这种情况了。(2)别用newInteger.和Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值通常都非常小。 2、开发过程需要注意的问题有下面这些: 服务…

    2024年5月23日
    4400
  • java基本类型内存,java基本类型内存占用

    java基本类型之间的共同点是什么 1、简单性: Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、指针等概念,所以Java语言学习起来更简单,使用起来也更方便。面向对象: Java是一种面向对象的编程语言。 2、JavaServlet是一种开发Web应用的理想构架。JSP以Servlet技术为基础,又在许多方面作了改进。JSP页面看…

    2024年5月23日
    4000
  • c语言动态内存分配,c语言动态内存分配数组

    c语言数组在内存中是怎么分配的? C语言中内存为分三类:栈区、堆区、静态数据区。局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。 堆上分配 堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。 \x0d\x0a数组元素都是连续存储…

    2024年5月23日
    4700
  • linux内核在内存1m,linux内核空间内存划分

    安卓手机Linux内核,存储在手机哪个部件里?一般占用多大内存? 1、Android内核一般放在一个ROM的小分区里(不带文件系统,看不到这个文件,而是在分区头部记录了内核的偏移地址),这是大部分手机的做法,不是绝对的(有放到fat文件系统里的)。 2、android 系统内核就是Linux,Linux支持虚拟内存(Virtual Mmemory),虚拟内存…

    2024年5月23日
    3900
  • c语言free释放内存错误,c语言释放动态内存

    c语言free释放内存出现堆损坏 1、free传入的参数 必须是malloc的结果 而你 在malloc之后赋值ptr为s 实际上等效于free(s)而s并不是malloc出来的 自然会出错。 2、是不是 while (1) 循环引起的 重复分配?若是,要 free 后才能再分配。 3、未释放之前在堆上申请的空间,造成内存泄露 比如上面q,如果程序中没有对其…

    2024年5月23日
    3700
  • linux内存管理初始化,linux 内存初始化

    linux中使用了什么内存管理方法,为什么 1、在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以使用—m参数以兆字节为单位显示内存使用情况。 2、Linux保留内核空间最顶部FIXADDR_TOP~4GB的区域作为保留区。当系统物理内存超过4GB时,必须使用CPU的扩展…

    2024年5月22日
    3600

发表回复

登录后才能评论



关注微信