java工程师具备思维导图
2017-05-01 18:02:30 39 举报
AI智能生成
java学习思维导图
作者其他创作
大纲/内容
jvm概念
启动流程
图例
启动流程
jvm内存模型
运行时数据区划分http://www.importnew.com/18961.html
堆
new出来的对象和数组
被所有线程共享
gc主要区域
程序计数器
下一条命令地址
每个线程私有
大小确定不会溢出
java栈
许多java栈帧,每个是一个方法
操作数栈
表达式的计算
局部变量表
基本数据类型值
数字类型
byte
1byte=8bit
2^8 =256表示256个数字
取值范围:2^7-1~-2^7=-128~127
第一位为符号位表示正负0正1负00000000
人脑思考有个0所以取值是这样的
为什么取值范围是这样
理论上计算机靠补码计算http://blog.csdn.net/pud_zha/article/details/7815109
原码
子主题
补码
子主题
反码
子主题
为什么用补码表示计算机数
传统二进制原码机器表示算不对
反码也不对多了一个-0的表示
伟大的人民脑子相处了个补码计算
多了一个-0正好用补码来表示-128
理论上在计算机里表示
int
4byte
32位
范围:2^32-1~-2^32
short
2byte
16位
long
8byte
浮点类型
float
4byte
double
8byte
字符类型
char
2byte
布尔类型
boolen
1byte
记忆
byte=boole=1 short=char=2 int=float=4 long=double=8
对象的引用
大小在编译时候就决定
常量池的引用
要用到常量必须要一个引用
方法返回地址
得存一个方法返回的地址
方法区
存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码
运行时常量池:有些在jvm加载进来时候已经有,有些事运行时后来新增如String
也是永久代?
注意不同jvm版本对应内存划分不一样java8没有永久代https://www.zhihu.com/question/49044988
native栈
调用本地方法
hotpot jvm把这个归在java栈中
运行时过程概况http://blog.csdn.net/suifeng3051/article/details/52611310
jvm内存模型
Static类型的变量以及类本身相关信息都会随着类本身存储在堆区
成员方法存在栈中,也就是说说的栈帧
成员变量共享,放在堆中,局部变量(本地变量)拷贝一份在栈中
硬件内存架构
物理结构
多核心
cpu中有寄存器,比主存快
主存ram
cup缓存比寄存器慢比缓存快(会有一级二级缓存)
存储过程
当一个CPU需要访问主存时,会先读取一部分主存数据到CPU缓存,进而在读取CPU缓存到寄存器。当CPU需要写数据到主存时,同样会先flush寄存器到CPU缓存,然后再在某些节点把缓存数据flush到主存
与java桥接过程
子主题
交叉关系
需要解决问题
可见性
未刷新到主存导致没有做到可见性
子主题
解决方法
volidate修饰
利用内存屏障(内存格栅)强制刷入主存和读取主存
不能保证原子性
automatic
共享对象的竞争关系(一致性)
修改后同时刷到主存
子主题
解决方法
synchronized
不能并发进行
原子性
原理?
CAS指令
可见性
5.0以后ReentrantLock
与synchronized区别
在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
优先考虑synchronized
GC http://blog.csdn.net/ithomer/article/details/6252552
jvm堆内存申请过程
子主题
1.JVM 会试图为相关Java对象在Eden中初始化一块内存区域
子主题
2.当Eden空间足够时,内存申请结束;否则到下一步
新生代较小
3.JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
拷贝算法
4.Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
5.当OLD区空间不够时,JVM 会在OLD区进行完全的垃圾收集(0级)
标记算法
老年代较大
6.完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory”错误
分代gc
jvm启动参数http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
-Xms
初始堆大小|物理内存的1/64(<1GB)|优化后最好和xmx一样大这样不用重新分配
-Xmx
最大堆大小|物理内存的1/4(<1GB)|默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn
新生代大小|物理内存1/64?|注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8|1.4后可以取代-XX:NewSize和-XX:MaxNewSize
-XX:PermSize
设置持久代(perm gen)初始值|物理内存的1/64
-XX:MaxPermSize
设置持久代最大值|物理内存的1/4|相对-XX:PermSize,慎用,以防出现java.lang.OutOfMemoryError: PermGen
-Xss
每个线程的堆栈大小|5.0以后1m|如果线程栈不是很深的情况下普遍128k足够,这里设置256k
-XX:ThreadStackSize
这两个参数在1.6以前,都是谁设置在后面,谁就生效;1.6版本以后,-Xss设置在后面,则以-Xss为准,-XXThreadStackSize设置在后面,则主线程以-Xss为准,其它线程以-XX:ThreadStackSize为准
-XX:NewRatio
年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)|Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio
Survivor区和Eden区的大小比值||设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
。。。
0 条评论
下一页