实战java虚拟机

实战java虚拟机

认识java虚拟机基本结构

类加载子系统、方法区、java堆、直接内存(NIO库辅助)、虚拟机栈、本地方法栈、PC寄存器、垃圾回收系统、执行引擎

java堆:不同堆不同结构,最常见:分代

java栈:函数调用——入栈 return/抛出异常——出栈
栈帧包括:局部变量表操作数栈、帧数据区
局部变量表:用于保存函数参数以及局部变量
操作数栈:保存计算中间结果同时作为计算过程中变量临时存储空间
帧数据区:支持常量池解析、正常方法返回和异常处理
栈上分配(优化技术),线程私有的对象(非逃逸对象)打散分配在栈上(需要在-server模式下使用-XX:+DoEscapreAnalysis参数启用)

方法区:用于保存系统的类信息
JDK1.8中,永久区被移除,使用元数据区(直接内存)

常用java虚拟机参数

包括跟踪java虚拟机垃圾回收和类加载信息、配置虚拟机堆空间、配置永久区和java栈

跟踪垃圾回收
-XX:PrintGC(Details) 遇到GC,打印日志
详细略

类加载/卸载的跟踪
-verbose:class 同时跟踪
-XX:+TraceClassLoading/Unloading 分别跟踪

系统参数查看
-XX:+PrintVMOptions

最大堆和初始堆设置
-Xms 初始堆大小 -Xmx最大堆大小
由于垃圾回收的需要,一般可用空间会小于-Xmx指定大小

新生代配置
-Xmn可以用于设置新生代的大小

堆溢出处理
-XX:+HeapDumpOnOutOfMemoryError获得发生错误时的错误信息

方法区配置
1.6/1.7 -XX:PermSize -XX:MaxPermSize
1.8 -XX:MaxMetaspaceSize

栈配置
-Xss

直接内存分配
-XX:maxDirectMemorySize 若不设置,默认为最大堆空间

虚拟机工作模式
-Client/-Server

垃圾回收概念与算法

垃圾回收算法

引用计数法:无法处理循环引用,性能影响

标记清楚法(Mark-Sweep):回收空间不连续

复制算法(copying):需要存活对象较少
分代算法新生代使用

标记压缩(Mark-Compact)
老年代使用

分代算法
新生代:复制
老年代:标记压缩/清楚
使用卡表记录某一老年代趋于中的所有对象是否持有新生代对象引用,避免整体扫描

分区算法
将整个堆空间划分成连续的不同小区间,每个小区间独立使用、独立回收
每次合理回收若干个小区间,减少一次GC所产生的停顿

判断对象可触及性

可触及、可复活(finalize中复活)、不可触及(finalize()被调用且没有复活)

引用类型:
强引用

软引用:堆空间不足被回收,因此软引用不会引起内存溢出
使用引用队列,当软引用对象不可达,进入队列

弱引用:发现即回收
也可使用引用队列

虚引用:持有虚引用和没有引用几乎一样,随时可能被回收,必须和引用队列一起使用

垃圾回收的停顿现象

垃圾收集器和内存分配

串行回收器

新生代串行:
单线程垃圾回收
独占式垃圾回收
复制算法、逻辑简单高效

老年代串行:
串行、独占
标记压缩算法
可以作为CMS备用回收器

并行回收器

新生代ParNew回收器:
工作在新生代
简单将串行回收器多线程化
回收策略和算法同新生代串行回收器一样
独占式

新生代ParallelGC回收器:
复制算法
表面看与ParNew类似,都是多线程、独占,但是其有一个重要的特点:它非常关注系统吞吐量
重要参数包括
-XX:MaxGCPauseMills:设置最大

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值