1.jvm的启动,先看一副图
这个是jvm的启动流程,从加载jvm的配置到找到JVM.dll找到我们的程序的主入口main方法的过程。
2.JVM的整体架构
这个是jvm的基本结构,jvm有的功能这里都展现出来的,加载class文件到方法区,生成对象到堆中,每个线程的私有的栈,垃圾收集器,实际执行引擎是这里的核心,它与所有的模块都有或多或少的交互
PC寄存器
每个线程拥有一个PC寄存器
在线程创建时 创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
方法区
保存装载的类信息
类型的常量池
字段,方法信息
方法字节码
通常和永久区(Perm)关联在一起
注意:jdk7以后Sring常量不会再方法去中分配空间,而是在堆中分配空间
Java栈
线程私有
栈由一系列帧组成(因此Java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈
注意:jvm对一些情景做了优化,并不是所有的对象都放到堆中,一些比较小的,且没有被共享的对象会分配到栈上,这样可以减少gc的次数,增加系统的性能
Java堆
和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享Java堆
对分代GC来说,堆也是分代的
GC的主要工作区间
堆主要分为新生代和老年代(tenured)和新生代,新生代可以可以分为eden区,s0,s1(幸存区)。s0和s1大小是相等的2个区,主要与GC算法相关。
下面是一个综合的例子,从下面例子可以看出
,在运行一个方法的时候,各个部分信息分配在jvm的哪个区里
从这里也可以看出来,静态方法是放在方法区的。
3.jmv的内存模型
从这个jvm内存模型图中可以看到,线程工作内存和主线程是存在着数据不一致性的,所谓的内存栅栏,那么我们怎么保证工作内存和主内存数据一致了,一种方法是,java为我们提供了锁的保护,在从主内存读取一个对象后,修改写回主内存这样锁才会释放,可以看成是原子性的
jvm指令重排
因为jvm会对运行指令进行优化,jmv会存在着指令重排问题,可以看下下面一个例子:
class OrderExample { int a = 0; boolean flag = false; public synchronized void writer() { a = 1; flag = true; } public synchronized void reader() { if (flag) { int i = a +1; …… } } }
假如有A,B 2个线程同时启动,A线程调用write方法,B线程调用read方法,在write线程中有2条语句,a=1,和flag=true,着2条语句执行是没有先后顺序的,可能先执行flag=true,这时候B线程就会执行到if语句块中,造成a的值和事先预想的不一致,为了解决这个问题,我们在方法上加上同步关键字synchronized这样就保证了方法体内所有的都是执行完成的,即线程A先执行,然后线程B执行,消除了指令重排的问题。
指令重排的基本原则
程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写,先发生于读
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C 那么A必然先于C
线程的start方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
相关推荐
JVM Diagnostics Guide 1.4.2 JVM Diagnostics Guide 1.4.2 JVM Diagnostics Guide 1.4.2 JVM Diagnostics Guide 1.4.2 JVM Diagnostics Guide 1.4.2
语言:português (Brasil) 在任何HTTP域上捕获全屏或特定应用程序的屏幕! 编码器网络没有任何控制权
JAVA 的JMV文件如果缺少大家可以下载
JamVM is a new Java Virtual Machine which conforms to the JVM specification version 2 (blue book). In comparison to most other VMs (free and commercial) it is extremely small, with a stripped ...
JVM调优分享,简单的一些分享,希望能帮助大家。凑字数真的烦!!!
MV 该模块代表jamovi随附的分析。 它包含许多常见的统计检验(例如t检验,ANOVA,相关矩阵,比例检验,列联表等)。... jmv可以通过以下方式安装: install.packages('jmv')jmv文档可以在jamovi网站上找到:
带PID的本地JMV 带有 url 的远程 JVM 选项 : -Djmx.service.host=localhost -Djmx.service.port=9990 -djmx.service.url=service:jmx:remote+ " -Djmx.service.login=仅在需要凭据时才需要登录 -Djmx....
1、支持录制DirectX 9/10/11、OpenGL 游戏和应用程序的高清视频,并且支持FPS游戏性能基准。 2、支持在游戏录制过程中实时添加音频解说,以制作完美的游戏视频教程! 3、自定义录制显示区域,选定应用程序窗口或...
maven3.6.1包,由于官网下载资源太慢,上传资源用于共享
强大的解压VCD/DVD播放器,支持RM/RMVB/MOV/SWF/MP3/WMA等目前Windows流行的音视频格式的播放。...JMV视频加密技术,实现视频文件的密码加密,预览等多种应用。----骨灰级的,,1990-2002年开始上网的朋友的怀旧
IBM HeapAnalyzer,很好用的JMV分析工具,IBM HeapAnalyzer允许寻找可能存在的Java堆泄漏区域,通过启发式搜索的引擎和分析Java应用程序的Java堆内存
Android应用程序从URL下载图像Android应用程序可从URL下载图像
对JAVA内部机制的一个介绍