#######################JVM学习笔记#########################
内存模型
关于JVM的内存模型,主要关注:方法区、堆内存、栈内存、类加载机制、垃圾回收机制。
方法区:
- 保存装载的类信息
- 字段,方法信息
- 方法字节码
- 类型的常量池
- 通常和永久区(Perm)关联在一起(jdk8中已经无永久区概念)
java堆:
- 线程共享内存区域
- 应用系统创建的对象保存在java堆中
- GC回收的主要阵地
主要区域分为:新生代、老年代。其中新生代又分为:E区,S0区、S1区
java栈:
- 线程私有
- 栈有一系列帧组成
- 帧保存一个方法的局部变量、操作数栈、常量池指针
- 每一次方法调用创建一个帧,并压栈
线程中内存相关概念:
每个线程执行过程中有一个工作内存和主存的概念,工作内存存放主存中变量的值的拷贝。(volatile关键字,变量在线程之间的可见性)
volatile关键字修饰的变量在线程之间的可见性,保证可见性的方法:
- volatile关键字(见如下示例代码)
- synchronized (unlock之前,写变量值回主存)
- final(一旦初始化完成,其他线程就可见)
package com.thread.study;
import org.junit.Test;
public class VolatileThreadTest{
@Test
public void testVolatile() throws InterruptedException{
VolatileThread volatileThread = new VolatileThread();
volatileThread.start();
Thread.sleep(1000);//主线程休息1s后更新状态
volatileThread.changeSts();
}
}
class VolatileThread extends Thread{
private volatile boolean stop = false;
public void changeSts(){
stop = true;
}
@Override
public void run() {
int i = 0;
do{
System.err.println(i++);
}while(!stop);
}
}
运行结果:运行1s后,随着主线程修改状态voaltileThread线程停止运行。
volatile关键字可以解决线程之间的可见性问题,但是仍不同与“同步”synchronized的作用,无法解决线程的安全问题。
所以需注意volatile的使用场景,在合适的场景使用该关键字。