转载

JAVA基础知识复习-JVM篇

JVM(Java Virtual Machine)是运行Java字节码的虚拟机,由一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器构成。

运行过程

.java(源文件)-> .class(字节码文件) -> 机器码

构成

类加载子系统加载.class文件,数据存入运行时数据区,即时编译器(跨平台)将.class文件编程成机器码,机器码通过本地接口库调用操作系统本地方法库执行程序

JAVA基础知识复习-JVM篇

类比物理机

具体地,在JVM中,线程引擎对标CPU,工作内存对标高速缓存,主存对主存。当多个处理器同时对Java主存进行操作的时候就会发生不一致现象。单应用下,这种不一致可以由Java并并发包提供的方法解决。例如AtomicLong,底层是通过CAS(compareAndSwap)来实现线程的同步,是在一个死循环内不断的尝试修改目标的值,直到修改成功。分布式下则可以通过redis等组件来完成。

JAVA基础知识复习-JVM篇

内存模型

线程共享区与JVM共存亡,线程私有区域与线程共存亡,堆外内存可以避免Java堆和Native堆之间来回复制的性能开销,在并发编程中被广泛应用。

JAVA基础知识复习-JVM篇

组件概要

  • 程序计数器:线程私有,记录实时字节码指令地址,执行Native则为空,唯一没有Out Of Memory的区域
  • 栈:线程私有,每个⽅法在执⾏时都会床创建⼀个栈帧(Stack Frame)⽤于存储局部变量表 、 操作数栈 、 动态链接 、 ⽅法出⼝等信息。每⼀个⽅法从调⽤直⾄执⾏结束,就对应着⼀个栈帧从虚拟机栈中⼊栈到出栈的过程
  • 本地方法区:线程私有,类似栈,区别是执行Native方法
  • 堆:线程共享,存放创建的对象和产生的数据
  • 方法区:线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,JDK1.8之后成为元数据区,原方法区的常量池和静态变量存在堆中,元数据区则在堆外内存!!!!!

常量池

#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
复制代码
原文  https://juejin.im/post/5c383ec4e51d455fc35dfd69
正文到此结束
Loading...