JVM(Java Virtual Machine)是运行Java字节码的虚拟机,由一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器构成。
.java(源文件)-> .class(字节码文件) -> 机器码
类加载子系统加载.class文件,数据存入运行时数据区,即时编译器(跨平台)将.class文件编程成机器码,机器码通过本地接口库调用操作系统本地方法库执行程序
具体地,在JVM中,线程引擎对标CPU,工作内存对标高速缓存,主存对主存。当多个处理器同时对Java主存进行操作的时候就会发生不一致现象。单应用下,这种不一致可以由Java并并发包提供的方法解决。例如AtomicLong,底层是通过CAS(compareAndSwap)来实现线程的同步,是在一个死循环内不断的尝试修改目标的值,直到修改成功。分布式下则可以通过redis等组件来完成。
线程共享区与JVM共存亡,线程私有区域与线程共存亡,堆外内存可以避免Java堆和Native堆之间来回复制的性能开销,在并发编程中被广泛应用。
#string pool中存的是引⽤值⽽不是具体的实例对象,具体的实例对象是在堆中开辟的⼀块空间存放的 #在堆中会有⼀个”abc”实例,全局StringTable中存放着”abc”的⼀个引⽤值 String str1 = "abc"; String str2 = "abc"; #如果常量池没有“abc”则⽣成两个实例,⼀个是”abc”的实例对象,并且StringTable中存储⼀个”abc”的引⽤值,还有⼀个是new出来的⼀个”abc”的实例对象 String str3 = new String("abc"); String str4 = str2.intern(); System.out.println(str1==str2);//true System.out.println(str1==str3);//false System.out.println(str1==str4);//true 复制代码