Java内存结构与模型

Python015

Java内存结构与模型,第1张

一 java内存结构

Heap(堆) 实例分配的地方 通过 Xms与 Xmx来设置

MethodArea(方法区域) 类的信息及静态变量 对应是Permanet Generation 通过 XX PermSize来设置

JavaStack(java的栈) 虚拟机只会直接对Javastack执行两种操作 以帧为单位的压栈或出栈 通过 Xss来设置 若不够会抛出StackOverflowError

ProgramCounter(程序计数器) 每一个线程都有它自己的PC寄存器 也是该线程启动时创建的 PC寄存器的内容总是指向下一条将被执行指令的饿地址 这里的地址可以是一个本地指针 也可以是在方法区中相对应于该方法起始指令的偏移量

Nativemethodstack(本地方法栈) 保存native方法进入区域的地址

当中Heap和MethodArea是被所有线程的共享使用的

而Javastack Programcounter和Nativemethodstack是以线程为粒度的 每个线程独自拥有自己的部分

二 内存模型

由以上可以知道java内存分为main memory和线程的Working Memory 就会涉及到这两种内存数据同步以及多个线程操作时数据一致性和可见性的问题 这就不可避免要加锁了 在java中可采用如下的形式

  synchronized关键字或使用ncurrent locks中的锁

  volatile关键字 Volatile表示的是线程每次操作都是在主内存中进行 这只能保证其可见性 而不能保证其的原子性 要有原子性还得加锁

  final变量(基本类型 类类型还是可以改值的)

三 如何保证线程安全

每个线程只操作自有的数据 这个可能性要小

设计的类无数据成员 也就没有共享变量 要有可用是 final或volatile

lishixinzhi/Article/program/Java/hx/201311/26489

区别很大:

《java多线程编程核心技术》:

这本书让你入个门,整体上了介绍一些并发编程的基本API、常见场景和一些坑,推荐先看这本书,比较简单,适合新手,但是原理不够深入

和《java并发编程的艺术》

这本书从底层和实现原理开始讲起,深入java内存模型和处理器的知识讲解并发编程的实现原理,适合有一定基础的人看