java虚拟机01

java虚拟机01
lamda表达式 匿名内部类。

class vm :

java 虚拟机内存管理:线程共享区 线程独占区。线程共享区是所有线程都可以共享,线程独占区是只有没一个线程自己才能有的一个空间。

java虚拟机01

每一个方法的执行都会进入栈内存。
java虚拟机01
如果申请不了内存 就会抛出内存溢出的错误。
java虚拟机01
本地方法栈

内存方法的管理。java虚拟机栈和本地方法栈。很相似
虚拟机栈 为虚拟机执行java方法服务。
本地方法栈为虚拟机执行native 执行 重点在java虚拟机栈。

java堆
存放对象实例 垃圾收集器管理的主要区域 新生代 老年代。eden空间,线程共享的,为了垃圾回收器。
OutOfmemory 异常。

方法区
属于线程共享区。类信息:类的版本字段 方法接口 都是属于类的信息。
常亮静态变量 。。。。。
java虚拟机01
运行池常量池: 通过字符串举例子。
方法区里面有一个运行池常量池。字符串创建放在里面。
java虚拟机01

java虚拟机01
这两个创建 通过new 来创建 在堆内存中创建直接赋值给s3
intern会把堆内存中的数据搬到运行池常量池中。
java虚拟机01
直接内存 是存在的区域但是不是java虚拟区内存。提高性能 收到操作系统物理内存的制约。
直接内存存在但是用不太多。

对象的创建
虚拟机的角度实现对象的创建过程。
java虚拟机01
给对象分配内存方法:
指针碰撞;
java虚拟机01
已使用的内存与未使用的不是规整的时候就不能用内存碰撞。有可能是交错的。
拥有个表几率哪些内存没有使用记录。方式是 空闲列表。内存是否规整 -----》有垃圾回收策略决定。
java虚拟机01

线程安全性问题: 如何解决呢?实现线程同步加锁。 执行效率低 !!!!线程同步。

提高效率:独立分配自己的区域。本地线程分配缓冲 TLAB 每个线程有自己的区域就不会出现线程安全的问题了。
但是如果沾满了自己的分配的内存:再分配一些区域实现同步策略。
java虚拟机01

初始化对象:加分配的地方初始化默认值为零值。

对象 了解你的对象吗?
对象的结构:
Header:(对象头)
自身的运行时数据(Mark Word)
(哈希值 Gc 分带年龄 锁状态标志 线程持有锁 偏向时间戳 )
类型指针
*InstanceData 数据的实例
真正存储的对象的有效信息 long double short char 相同字段分配到一起 父类对象放在子类对象之前、
Padding
填充内存作用没有实际意义。

java虚拟机01

对象访问定位
栈内存 直接调用指向堆内存中的地址:直接指针
通过句柄池 鞠炳池存在在堆内存中里面存在对象实例。然后找到对象真正地址 引用地址不需要换换的话就是 实际地址而已。

Hotspot采用直接地址
java虚拟机01
java虚拟机01

垃圾回收

java虚拟机 内存 让java虚拟机处理
高并发出现瓶颈来实现优化。深入了解垃圾回收1.如何判定对象为垃圾对象 2。如何回收
3.何时回收
、////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
java虚拟机01

在对象中添加引用计数器
当有地方引用这个对象的时候 ,引用计数器的值就加一 当引用失效的时候就引用计数器就减一。

目前没有人使用 认定垃圾改被回收 但是数值不是0 所以不能回收。
java虚拟机01

通过main 方法实现引用区域。

java虚拟机01
java虚拟机01

可达性分析法:
定义GCRoot 找到对象就是没事 就不是垃圾 如果找不到就是垃圾 没有任何引用链那就是垃圾。
GCRoot的起点
java虚拟机01
java虚拟机01
看的不是是否被引用像上面的引用计数法 (被别人引用了就不能回收 ) 是否被GCRoot对象引用4如若没有被引用就是一个废物。
java虚拟机01

如何清除:
标记清除算法: 标记 出所回收的对象 通过可达性分析法 分析出来没有任何引用引用他 就会有个标记 标记他 就清除掉。
但是很啰嗦,不适合标记。
内存中会出现很多碎片出现很多不连续的空间、
效率问题和空间问题。java虚拟机01
java虚拟机01
复制算法:
解决垃圾清除的效率问题。线程共享区域和线程独享区域。栈内存 本低方法栈 程序计数器

堆: 新生代(Eden 伊甸园 survivor 存活区 ) 和 老年代

来回倒腾‘ 缺点: 浪费空间 只能用一般自己的内存空间。’
把没有标记的复制到另外一半区域 内存空间极度浪费。

java虚拟机01

java虚拟机01
java虚拟机01
java虚拟机01
程序计数器就是上一次执行完a后 在第三个节点处 然后执行B在第四个节点处 然后 再回到A处 就可以记住直接在第三个节点处继续执行。
java虚拟机01

java虚拟机01
改进:概述

如果jvm使用了coping算法,一开始就会将可用内存分为两块,from域和to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理。

应用场景

coping算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用coping算法进行拷贝时效率比较高。

jvm将Heap 内存划分为新生代与老年代,又将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区) ,然后在Eden –>Survivor Space 以及From Survivor Space 与To Survivor Space 之间实行Copying 算法。

不过jvm在应用coping算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。一般的jvm都是8:1。也即是说,Eden区:From区:To区域的比例是8:1:1

始终有90%的空间是可以用来创建对象的,而剩下的10%用来存放回收后存活的对象。
java虚拟机01
1、当Eden区满的时候,会触发第一次young gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发young gc的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。
2、当后续Eden又发生young gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。
3、可见部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入到老年代

注意:

万一存活对象数量比较多,那么To域的内存可能不够存放,这个时候会借助老年代的空间。

优点

在存活对象不多的情况下,性能高,能解决内存碎片和Java垃圾回收之标记清除算法详解 中导致的引用更新问题。

缺点

会造成一部分的内存浪费。不过可以根据实际情况,将内存块大小比例适当调整;
如果存活对象的数量比较大,coping的性能会变得很差。

java虚拟机01

java虚拟机01

java虚拟机01

老年代垃圾回收:
标记整理算法 老年代里面的东西不容易死。

减少发生full GC

java虚拟机01

垃圾收集器 serial 收集器
java虚拟机01
parNew 收集器 多线程收集器 多个用户同时运行。
多个垃圾回收器进行回收 好处:jdk1,5 cms垃圾收集器 并发收集器。用于回收老年代内存。
java虚拟机01

parallel Scanvenge收集器 新生代 收集器 多线程收集器 复制算法。
parnew 关注点:缩短中间那部分时间。
parallel 达到可控制的吞吐量。(运行用户代码的时间与CPU消耗总时间的比值)

java虚拟机01
java虚拟机01

cms收集器 并发收集器:“

标记标记 清除是重点。通过一些方法提高一些性能。
并发的垃圾收集器
一同执行。的操作。
java虚拟机01
java虚拟机01

G1
java虚拟机01
java虚拟机01
java虚拟机01

过程:
初始标记 并发标记 最终标记 筛选回收

内存分配