今天给各位分享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程序员面试会遇到哪些问题
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内存模型面试回答的信息别忘了在本站进行查找喔。