本文为Java后端面试自学内容,记于此以便学习和回忆,如有侵权或错误,欢迎讨论指教;如果转载请注明出处!
结论:内存区域和内存模型是不同的两个概念。
内存区域
方法区(共享):加载的类信息 常量 静态变量 即时编译后的代码
堆(共享): 对象的实例
程序计数器(私有):当前线程所执行的字节码行号指示器
虚拟机栈(私有):每个方法执行时都会创建一个栈帧
本地方法栈(私有):native方法相关
此外Java中的堆从垃圾回收的角度分为新生代和老年代。
其中新生代存放新生的对象分为:Eden Servivorfrom和Servivorto三个区,其中from和to名字在垃圾回收后会互换,也就是垃圾回收时扫描eden区和from区,把存活的对象保存到to区,然后to区更名为from区,以便下此扫描。
新生代触发MinorGC 进行垃圾回收(复制算法)。
老年代触发MajorGC进行垃圾回收(标记清除算法)。
内存模型
内存模型:为了保证共享内存的正确性(可见性、有序性和原子性)内存模型定义了共享内存系统中多线程读写操作的规范。
jmm是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在本地数据不一致,编译器会对代码指令重排序,处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。jvm为每个线程定义工作内存,数据在主内存中,线程对数据的操作必须在工作内中进行。
详细可以参考(写的非常好)https://blog.csdn.net/javazejian/article/details/72772461