没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
13页
自己看书整理的 java虚拟机精品知识点 java内存区域与内存溢出处理 虚拟机栈和本地方法栈区别 对象定位访问 垃圾收集器GC管理 虚拟机GC垃圾回收收集算法(内存回收方法论) 虚拟机GC垃圾回收收集器(内存回收具体实现) 对象内存分配 虚拟机性能监控与故障处理工具 内存溢出问题及调优 类文件结构 虚拟机类加载机制 编译期编译优化 运行期优化 高效并发-java内存模型与线程 线程安全与锁优化 1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),在标记完成后统一回收所有被标记的对象。 缺点:效率问题,标记和清除两个过程效率都不高,另一个是清除之后会产生大量不连续的内存碎片,以后分配较大对象内存时,无法分配连续的大空间内存。 2 复制算法:将可用内存分为2块,每次使用A块,当A内存用完了,就将还存活的对象复制到B块内存中,然后再将A内存中所有可回收的对象全部清理掉。 优点:实现简单,运气高效,没有内存碎片问题。 缺点:将内存缩小为原来的一半,内存代价高。 3 标记-整理算法:与标记清除算法类似,不过在清除阶段不是直接回收,而是首先让所有存活的对象
资源推荐
资源详情
资源评论
一 虚拟机类型:高性能 java 虚拟机
1 Sun 公司 Hotspot VM
2 BEA 公司 JRockit VM
3 IBM 公司 J9 VM
二 java 内存区域与内存溢出处理
内存运行时数据区域:
1 方法区:线程共享,(永久代),存储已被虚拟机加载的类信息,常量,静态变量,即
时编译后的代码数据(动态运行时数据?)等。当无法满足内存分配需求扩展时,抛出内
存溢出 OutOfMemoryError 异常。
运行时常量池:方法区的一部分,class 文件中除了有类的版本,字段,方法,接口等
信息,还有一项常量池用于存放编译期生成的各种字面量和符号引用,将在类加载后
进入方法区的运行时常量池中存放。
2 堆:线程共享,虚拟机管理内存最大的一块,目的存放对象实例,垃圾收集器管理
的主要区域,也称 GC 堆,对象实例可分为新生代和老年代(对应分代收集算法),当没
有内存分配对象实例并且也无法再扩展内存时,抛出内存溢出 OutOfMemoryError 异
常。
3 虚拟机栈:线程私有,存储方法的局部变量表(存放方法的各种基本数据类型,对象
引用等),动态链接,方法出口等信息,方法从调用到执行完成,对应一个栈针在虚拟
机栈中入栈到出栈的过程。当扩展时无法申请到足够的内存时,抛出内存溢出
OutOfMemoryError 异常。
4 本地方法栈:与虚拟机栈类似,服务于本地 Native 方法。
5 程序计数器:线程私有,较小的内存空间,当前线程所执行的字节码的行号指示器,
相当于每个线程的一个标识。没有内存溢出异常 OutOfMemoryError。
6 直接内存:本机内存,堆外内存。
虚拟机栈和本地方法栈区别:
虚拟机栈为虚拟机执行 java 方法(字节码)服务。
本地方法栈为虚拟机使用的本地 Native 方法服务。
Hotspot VM 将虚拟机栈和本地方法栈合二为一。
-Xmx 和-Xms 可以设置堆内存的最大和最小分配,将 2 个值设置一样则堆内存大小固
定无法扩展。
对象定位访问
1 句柄访问:稳定,对象被移动时只改变句柄中的实例数据指针。
2 直接指针访问:速度更快,节省指针定位时间开销。Hotspot VM 使用方法。
三 垃圾收集器 GC 管理
判断对象存活:
1 引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它,计数器值+1,
当引用时效时,计数器-1,任何时刻计时器为 0 的对象就是不可能再被使用的对象。
缺点:对象互相引用的时候(再无任何其他引用),计数器不为 0,GC 无法回收这些相
互引用的对象。
2 可达性分析算法:
GC roots 作为对象起始点,开始向下搜索,搜索走过的路径为引用链,当一个对象到
GC roots 没有任务引用链相连(GC roots 到这个对象不可达没有关联)时,则证明此对
象是不可用的,可以回收。可以解决引用计数算法中对象相互引用的问题。
对象引用:
强引用:new Object 引用,只要强引用还在,GC 不会回收被引用的对象。
软引用:有用但并非必需的对象,SoftReference 类实现软引用。
弱引用:非必需对象,强度比软引用更弱,该对象只能生存到下一次垃圾回收器发生
之前,GC 工作时,无论内存是否足够,都会回收弱引用对象。WeakReference 类实现。
虚引用:最弱的引用关系,唯一目的就是该引用关联的对象被 GC 回收时收到一个系统
通知。PhantomReference 类实现虚引用。
1 堆中的新生代中,常规应用进行一次 GC 回收一般可以回收 75%-95%的内存空间。
2 而方法区永久代中,GC 回收的性价比很低,不建议在方法区中垃圾回收内存空间。
方法区永久代中回收主要是 2 部分内容:废弃常量和无用的类。
一个类是无用 的类判定:
该类所有的对象实例都已被回收,java 堆中不存在该类的任何实例。
加载该类的 ClassLoader 已经被回收。
该类对应 的 class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的
方法信息。
四 虚拟机 GC 垃圾回收收集算法(内存回收方法论)
1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),
在标记完成后统一回收所有被标记的对象。
缺点:效率问题,标记和清除两个过程效率都不高,另一个是清除之后会产生大量不
连续的内存碎片,以后分配较大对象内存时,无法分配连续的大空间内存。
2 复制算法:将可用内存分为 2 块,每次使用 A 块,当 A 内存用完了,就将还存活的
对象复制到 B 块内存中,然后再将 A 内存中所有可回收的对象全部清理掉。
优点:实现简单,运气高效,没有内存碎片问题。
缺点:将内存缩小为原来的一半,内存代价高。
3 标记-整理算法:与标记清除算法类似,不过在清除阶段不是直接回收,而是首先让
所有存活的对象向一端移动并整理,然后再清除掉可回收的对象,这样可以避免 内存
碎片空间问题。没有内存碎片。
4 分代收集算法:当前商用虚拟机的首选,根据对象存活周期将内存划分为几块,一
般分为新生代和老年代,在新生代中选用复制算法(新生代可回收对象很多适合复制算
法),老年代中选用标记清除或者标记整理算法(老年代中对象存活率高。适合标记法)。
五 虚拟机 GC 垃圾回收收集器(内存回收具体实现)
Hotspot 虚拟机垃圾收集器:
1 Serial 收集器:单线程收集器,进行垃圾收集时,必须暂停其他所有线程工作,直到
收集结束,运行 Client 模式下的默认的新生代收集器,也是 client 模式下虚拟机收集
器很好的选择,优点:简单而高效(没有线程交互开销,专心做垃圾收集工作)。
剩余12页未读,继续阅读
资源评论
心想事成All
- 粉丝: 3
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功