JAVA-JVM篇

                   编译为 .class 文件       命令  javac 
Java 代码执行       装载 class              ClassLoader  
                                                      client    compiler
                                          编译执行 -  
                   执行 class  	                      server    compiler
                                          解释执行
解释执行: 将编译好的字节码一行一行地翻译为机器码执行。
编译执行: 以方法为单位,将字节码一次性翻译为机器码后执行。
                                方法区
                                堆
                内存空间         方法栈
                                本地方法栈
                                pc 寄存器(程序计数器)
                                
                                栈上分配
                内存分配         TLAB(Thraad Local Allocation Buffer)
                                堆上分配

                                                Copy
                                算法             Mark-Sweep 
                                                Mark-Compact

                                                                                       串行 copying 
                                                                新生代可用的GC           并行回收 copying        
                                                                                       并行 copying
                                                                                       
内存管理                                                         Minor GC 触发机制以及日志格式

                                                分代回收                               串行 Mark-Sweep-Compact
                内存回收                                         旧生代可用的GC          并行 Compacting
                                                                                      并发 Mark-Sweep
                                                                                      
                                                                Full GC触发机制以及日志格式                        
                                 Sun JDK   
                                                GC 参数
                                                G1

                                 Jconsole
                                 Visualvm
                内存状况分析       Jstat     
                                 Jmap
                                 MAT
                                                线程资源执行机制
                            线程资源同步                                  Synchronizad 的实现机制
                                                线程资源同步机制         
                                                                        lock/unlock 的实现机制
                                                                        
                                                        
                                                Object.wait/notify/notifyAll
线程资源同步和交互机制                              Double check pattem

                            线程交互机制                                  Semaphore
                                                并发包提供的交互机制
                                                                        CountDownLatch
                                                                      
                                                Jstack
                            线程状态及分析方法 
                                                TDA

运行过程
JAVA 源文件 --> 编译器 --> 字节码文件 -->JVM–>机器码
JVM的组成及内存区域

                        程序计数器PC:          指向虚拟机字节码指令的位置(唯一一个没OOM的区域)
                        
                                              虚拟机栈和线程的生命周期相同
                                              
                                              一个线程每调用一次产生一个栈帧(Stack Frame)                           
                        虚拟机栈:              
                        					   				本地变量表 Local Variable                         
          线程私有   						  栈帧的结构     操作数栈 Operand Stack
                                                      		 对运行时常量池的引用 Runtime Constant Pool Reference
                                   
                                                      线程请求的栈深度大于JVM所允许的深度 StackOverflowError           
                                              异常           
                                                      若JVM允许动态扩展 若无法申请到足够的内存 OutOfMemoryError

                        方法区(永久代):        运行时常量池 RunTime Constant Pool
            线程共享    
JVM内存                                                 eden 
                                              新生代   from survivor 
                                                       to  survivor
                        类实例区(JAVA堆)        老年代
                                               异常:    OutOfMemoryError
 
            直接内存 Direct Memory  不受JVM GC管理

程序计数器: 一块较小的内存空间,是当前线程所执行的字节码文件的行号指示器,每个线程都会有独立的程序计数器(这类内存为线程私有)正在执行Java方法 计数器记录的是虚拟机字节码指令的地址(当前指令的地址)如果为Native 方法(非Java实现接口),则为空。这块内存区域唯一一个在虚拟机中没有规定任何OutOfMemoryError(OOM)情况的区域

虚拟机栈: 是描述JAVA方法执行的内存模型,每个方法执行的同时都会创建一个栈帧(Stack Frame) 用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至执行完成的过程 就对应着一个栈帧在虚拟机中入栈到出栈的过程

				栈帧: (Frame) 是用于储存数据和部分过程结果的数据结构, 同时也被用来处理动态链接(Dynamic Linking)方法返回值和异常			分派		(Dispatch 	Exception)栈帧随着方法的调用而创建,随着方法结束而销毁 (无论方法是正常结束还是异常完成包括抛出了方法内未捕获的异常)

本地方法区 (线程私有): 本地方法区和JAVA Stack 作用类似 ,区别是虚拟机栈为执行JAVA方法服务,而本地方法栈则是为Native 方法服务,如果一个VM 实现 一个C-linkage 模型来支持 Native 调用,那么该栈将会是一个C栈,但HotSpot VM 直接就把本地方法栈和虚拟机栈合二为一

堆(Heap)(线程共享,运行时数据区): 是被线程共享的一块区域,创建对象,数组 都保存在JAVA Heap 内存中 也是垃圾收集器的主要工作区域。现VM采用分代回收算法 Heap 细分为 新生代(eden,from survivor,to survivor)和老年代

方法区/永久代(线程共享):用于存储被JVM加载的类信息,常量,静态变量,即时编译后编译后的数据。HotSpot VM 把GC 分代收集扩展至方法区内, 即使用JAVA Heap 的永久代来实现方法区 ,这样HotSpot的垃圾收集器就可以像管理Heap 一样管理这片区域,而不必为方法区开发专门的内存管理器 (方法区的内存回收主要目标是针对于常量池的回收和类型的卸载,因此受益一般很小)

		运行时常量池(Runtime Constant Pool):是方法区的一部分 ,class文件中除了有类的版本,字段,方法,接口等描述信息外 还有一项信息就是常量池

	   常量池 (Constant Pool Tatle) 用于存放编译期生成的各种字面量 和 符号的引用 ,这类内容 将在类加载器加载后存放到方法区的运行时常量池中 ,JAVA 虚拟机对 class 文件 的每一部分(包括常量池)的格式都有严格的规定,每一个字节存储哪一种数据都必须符合规范上的要求 这样才会被虚拟机认可 装载 和运行

运行时数据区: JAVA Heap 从GC角度可细分为 新生代(eden,from survivor, to survivor) 老年代

	Heap 老年代占2/3空间  新生代占1/3, 新生代又分为 eden占新生代 8/10 ,from 占1/10 , to 占1/10
	新生代 是用来存放刚创建的对象。由于频繁的创建对象 所以新生代会频繁触发Minor GC 进行垃圾回收 。(如果新创建的对象太大则直接进入老年代,当eden内存不够时就会触发 Minor GC 对新生代进行一次垃圾回收)
	FromSurvivor 上一次GC的幸存者 做为这次的扫描着
	ToSurvivor 保留了一次 Minor GC 过程的幸存者
	Minor GC 的过程 复制 - 清空 - 互换 采用复制算法
	eden.From Survivor 复制到 ToSurvivor 年龄+1 
		首先 把eden和FromSurvivor 区域存活的对象复制到To Survivor 区域 (如果有对象年龄达到老年标准则直接赋值到老年区)同时把这些对象的年龄+1(如果To Survivor不够位置了就放到老年区)
	然后清空eden,FromSurvivor中的对象
	ToSurvivor 和 FromSurvivor 互换 (原ToSurvivor 成为下一次GC 的FromSurvivor)
	老年代: 主要存放应用程序中生命周期较长的对象。老年代比较稳定。MajorGC 不会频繁的执行 。在进行Major GC 前一般都进行了一次Minor GC ,使得有新生代对象晋身入老年代。导致空间不够用才触发的。当无法找到足够大的连续空间分配给新创建较大的对象时也会提前触发一次Major GC进行垃圾回收腾出空间
	Major GC 采用 标记清除算法: 首先烧扫描一次所有的年老代 。标记出存活的对象 然后回收没有标记的对象。Major GC 的耗时比较长。因为要扫描再回收。Major GC 会产生内存碎片。 为了减少内存消耗,我们一般需要进行合并或者标记出来方便下次直接分配。当年老代也满了装不下的时候就会抛出OOM(Out Of Memory) 异常

永久代:指内存中永久保存的区域,主要存放class Meta(元数据)的信息 ,Class 在被加载的时候被放入永久区域。它的存放和存放实例的区域不同。GC 不会再程序运行中对永久区域进行清理。 所以这也导致了永久代的区域会随着 加载的Class的增多而涨满 最终抛出OOM(Out Of Memory)异常

JAVA 8 与 元数据: 在JAVA 8 中 永久代已经被移除。被称为 元数据区 (元空间) 的区域取代 。元空间的本质跟永久代类似 , 元空间和永久代最大的区别在于 元空间并不在虚拟机中,而是使用本地内存。因此 默认情况下 元空间的大小受本地内存的大小限制 。类的元数据放入 Native memory, 字符串池和类的静态变量 放入 Heap 中 。这样可加载多少类的元数据就不在由MaxPermSize控制。而是由系统的实际可用空间来控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值