1. JVM
线程私有内存:
- 程序计数器(Program Counter Register):保留当前线程执行方法
- Java虚拟机栈(JVM Stack):方法的栈帧
- 本地方法栈(Native Method Stack):存储native方法信息
多线程共享内存:
- 堆(Heap):存储对象和数组
- 方法区(Method Area):存储类结构/常量/静态变量,运行时常量池:属于方法区
1.1. 程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
1.2. Heap
Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域用来存放对象实例,几乎所有的对象实例都在这里分配内存,垃圾回收器也主要在堆内工作。
java堆:分为新生代和老年代,
- 老年代进行fullGC:
- 或者使用system.gc
- 老年代满后
java性能调优的目的:(调整full gc调整频率以及响应时间)
工具:jvisualvm,jconsole
1.3. JVM Stack
Java 虚拟机栈(Java Virtual Mach1ne Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型: 每个方法被执行的时候都会同时创建一个栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程, 就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
- 方法出口:是指方法的调用者
- 局部变量表:放置运行过程的数值
- 操作数栈:放置运行过程的数值
1.4. Method Area
方法区(Method Area) 与Java 堆一样, 是各个线程共享的内存区域, 它用于存
储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。