深入理解JVM

JAVA内存模型

运行时数据区域,JVM在执行JAVA程序是将其所管理的内存划分为不同的数据区域

程序计数器,线程私有

记录当前线程执行字节码的行号,多线程切换后能够正确的恢复到程序执行的位置

虚拟机栈 ,线程私有,生命周期与线程相同

虚拟机栈描述的是JAVA方法执行的内存模型

方法执行时会创建一个栈帧的数据结构,栈帧存储了局部变量表(方法的参数,方法中的局部变量),操作栈,动态链接,方法出口等信息

方法的执行过程就是栈帧进栈和出栈的过程

本地方法栈,与虚拟机栈功能类似,为本地方法服务

Java堆区(Heap)  线程共享的

虚拟机管理的最大一块区域 

用来存放对象实例

也是垃圾收集器主要工作的区域   按照内存回收的角度又分为

                        新生代(Eden ,survivor) 经验性 死亡率高达97%需老年代提供担保  用少量存活对象的复制代价完成清理

                        老年代   存活率高 用  标记-清除   或   标记-整理算法  为新生代提供担保空间,一旦存活对象survivor无法容纳直接进入老年代 

方法区 线程共有的

主要用来存放类信息 ,静态变量 ,常量

内存回收目标有两个;类型的卸载   常量池的回收

    运行时常量池 :用来存放 字面量 ,符号引用 。

对象是否存活?

引用计数法:为对象添加一个计数器,对象每被引用一次计数器加一,当一个引用失效计数器减一,当计数器为0时说明对象不可用

缺点:无法解决循环引用的问题 A.S=B ,B.S=A  python用次算法

可达性分析算法(跟搜索算法)

通过一系列的‘’GC Roots‘’ 的对象向下搜索 搜索走过的路径称为引用链 若对象到GC Roots没有任何引用链时 对象就是不可用的

可作为GC Roots 的对象

                           方法区的静态变量,常量 引用的对象

                           虚拟机栈 局部变量表中引用的对象

                           本地方法栈 中本地方法引用的对象


标记-清除算法

首先标记出所有要回收的对象,标记完成后统一清理所用被标记的对象

缺点:产生大量的空间碎片,分配大对象是无法找到足够的连续内存

标记-整理算法

让所有存活的对象移动到内存的一端,清理掉边界外的内存。

复制算法 

将新生代分为一块Eden区 和两块Survivor区域(8:1:1),每次使用Eden区和一块Survivor区,回收时将存活的对象复制到另一块Survivor区

最后清理掉Eden区,和Survivor区。

利用了新生代的朝生夕死的特性,付出少量的存活对象的复制代价完成清理 ,需要老年代担保

分代收集算法:根据对象存活周期不同分为 新生代,老年代

垃圾收集器

serial收集器

单线程收集垃圾,用户线程 STOP THE WORD

优点:无线程交互的开销 ,专心做垃圾收集工作

ParNew收集器 多线程版serial   

Parallel Scavenge收集器(吞吐量)

吞吐量=用户线程时间 / CPU总消耗时间  适合后台运算不需要太多交互的任务

CMS 垃圾收集器(Concurrent Mask Sweep)最短停顿时间 重视服务的响应速度

1 初始标记  快速扫描GC Roots直接引用的对象  需要STOP THE WORD

2 并发标记  与用户线程并行 

3 重新标记  STOP THE WORD 标记那些并发标记因用户线程改变的对象引用

4 并发清理  

缺点:标记-清除算法 产生空间碎片   

            并发清理时产生的垃圾无法进行收集,产生浮动垃圾

             并发标记与用户线程并行效率不高

G1 垃圾收集器(Garbage first)

致力于非常精确的控制停顿

G1将堆内存划分为多个大小固定的独立区域(Region),并跟踪每块区域的垃圾堆积程度,计算垃圾回收价值(回收需要的时间,回收获得的空间)在后台维护一个优先表,根据每次允许的收集时间来优先回收价值最大的区域。


对象优先分配在Eden区 

大对象直接进入老年代,避免在Eden区和Srvivor区发生大量内存拷贝

长期存活的对象进入老年代,对象每熬过一次minor GC年龄+1 增加到15晋升老年代

动态年龄划分:在Survivor空间中所有相同年龄的所有对象大小大于Survivor的一半,大于等于与该年龄的对象进入老年代


类加载机制

加载  

通过类的权限名获取次类的二进制字节流,将字节流代表的静态储存结构转换为方法区的运行时数据结构

在java堆生成java.lang.Class对象作为方法区这些数据的访问入口

 连接   分为三个阶段(验证,准备,解析)

验证是连接的第一个阶段

1文件格式验证 字节流是否满足Class文件要求 ,

2元数据验证(父类是否继承final修饰的类,不是抽象类是否实现了父类或接口的全部方法)

3字节码验证

4符号引用验证

准备

准备阶段是正式为类变量分配内存(方法区)并设置初始值(零值)的阶段,

解析

符号引用(用符号描述所引用的目标)变成直接引用(直接指向对象的指针或句柄)

 初始化

执行java代码


双亲委派模型

两个类是否相等,不仅要求是同一个Class文件还必须是一个类加载器加载的

如果一个类加载器收到了类加载的请求,它首先不会尝试自己去加载这个类,而是把这个请求委托给父类去完成,因此所有类加载的请求都应该传送到顶层的启动类加载器,只有当父类反馈自己无法完成这个加载请求(他的搜索范围没有找到这个类)时子类加载器才会自己去尝试加载这个类。
















最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容