1、JVM基本结构

#######################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的使用场景,在合适的场景使用该关键字。

 

猜你喜欢

转载自blog.csdn.net/yanghw117/article/details/80862518