前言: 面试经常被问到JAVA内存模型和Java内存结构的区别
JAVA内存模型:(共享内存模型JMM)定义了一个线程对另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据时,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题
Java内存结构
方法区:
是static关键词修饰,常量信息,当class文件被加载的时候,就会初始化,所有的线程会被共享,也就是线程共享资源存放。会有线程安全问题。调优问题: web开发定义常量太多不好。第一点会有线程安全问题。第二点会造成内存溢出。
堆:
创建对象。new创建,数组。存放在堆内存中,堆所有线程会被共享,也有线程安全问题。(堆调优策略。)
栈:
定义的局部变量都存放在栈里面。代码运行完毕,自动释放内存。每个线程不共享,每个线程私有的,不会发生线程安全问题。(类中的方法存放在栈中)
内地方法栈:
主要是用来调 C语音的。(例如:安卓开发,安卓应用层是Java api,最底层是C语音,如果要调用C语言 就是通过 JNI调用。)
PC寄存器:
就相当于底层线程私有的,不会共享,它里面包含指针,计算变量的指针等等
执行引擎:
执行字节码文件的一个作用。也就是负责执行虚拟机的字节码,一般先编译成机器码后执行。
垃圾回收机制
垃圾回收机制是Java语言一个非常重要的特性。通过该机制程序员不用手动去管理内存,大大提高了开发效率,也可以有效避免人为的疏忽造成内存泄露。