JVM知识

JVM
java内存区域

线程共享区域:堆、方法区(包含常量池)-1.7之后常量池放入堆中

线程私有区域:虚拟机栈,本地方法栈、程序计数器

直接内存:1.8 将方法区移到直接内存中

虚拟机栈:主要存放了线程中方法调用的参数数据,包括基本数据类型,对象的引用等局部变量。

本地方法栈:和虚拟机栈类似,但存放的是native修饰的本地方法。

堆:虚拟机内存中占比最大的一块,线程共享,唯一目的是存放对象实例。是垃圾收集器管理的主要区域,也称作 GC堆。

方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译的代码等。永久代是hotspot虚拟 机对方法区的实现

堆的基本结构

新生代:eden区,s0(survivor0),s1(survivor1)

老年代:tentired

当eden内存不够时,将会发起一次Minor GC。老年代GC:Full GC速度比Minor GC慢十倍以上。

垃圾回收:新对象一般会先在eden区域分配,一次垃圾回收之后,如果对象还存活会存入s0或s1,对象年龄加1.

默认年龄到达15岁,会晋升到老年代。年龄阈值可通过参数配置。大对象和长期存活的对象会直接进入老年代。

虚拟机如何判断对象死亡

引用计数法:每有一个引用,计数器加1,失效减1,计数器为0时对象不能再被使用。没有被java虚拟机采用,因为存在对象循环引用问题,导致对象无法被处理。

可达性分析算法:当一个对象到GC Roots节点没有任何引用链,证明对象已经不可用。

垃圾收集算法

标记-清除算法:标记需要回收的对象,标记完成后统一清除。

问题:效率,会产生不连续空间碎片。

复制算法:内存分两块,每次使用一块,使用完后把存活的对象复制到另一块,然后清除死亡对象。效率高。

标记-整理算法:老年代算法,基于标记-清除,清除前把存活对象移动到同一端,清理掉边界以外的内存。

分代收集算法:当前虚拟机都采用的算法,新生代,老年代。根据各个年代选择合适的算法。

类加载机制
动态加载

类是在运行期间第一次使用时,动态加载,而不是一次加载所有类,会占用大量内存。

类的生命周期

加载-验证-准备-解析-初始化-使用-卸载

解析有可能会在初始化之后,为了支持动态绑定机制,因为某些对象或方法需要在运行时才能决定到底是谁。

常见的垃圾收集器

1.Serial(串行)收集器
单线程串行收集器,简单高效,进行垃圾回收的时候必须暂停其他工作线程。新生代:复制算法。老年代:标记-整理算法。
2.ParNew收集器
Serial的多线程版本,不会阻塞工作线程。能与CMS收集器配合工作。
3.Parallel Scavenge收集器
JDK1.8默认收集器,与ParNew相似,但重点关注的是吞吐量(高效率使用cpu)。而CMS重点关注的是用户体验(更少的停顿时间)
4.CMS收集器
Concurrent Mark Sweep收集器,基于标记清除算法的并发GC收集器。
运行过程:
初始标记:暂停所有其他线程,标记直接与Root相连的对象,速度很快。
并发标记:并发记录可达对象,但可能会不完整,因为用户线程可能会不断更新引用域。
重新标记:修正更新的部分变更引用,停顿时间比初始标记稍长。
并发清除:并发对标记的对象进行清除。
5.G1收集器
Garbage-Fist,主要针对多核处理器,大内存的处理器,短停顿,高吞吐量。
6.ZGC收集器
与ParNew与G1类似,但对算法做了重大改进。

双亲委派模型

概念:每一个类都有一个对应的类加载器。系统中的类加载器协同工作时,会默认使用双亲委派模型,这里的双亲指的是父辈的意思。
模型原理:类加载时,会先从下到上判断类是否被加载过,而加载时,会从上到下进行加载,若父类加载器无法加载时,才由子类加载器进行加载。
作用:保证程序稳定运行,一个类只会由一个加载器加载,避免重复加载。

常用jvm启动参数

设定时区
-Duser.timezone=GMT+8
jvm使用server模式,启动慢,性能和内存效率高。
-server
堆的初始大小
-Xms4096m
堆的最大值
-Xmx4096m
Eden区和Survivor区的大小比值
-XX:SurvivorRatio=4
关闭System.gc()
-XX:+DisableExplicitGC
开启ParNew垃圾收集器
-XX:+UseParNewGC
开启CMS垃圾收集器
-XX:+UseConcMarkSweepGC
开启CMS并行重新标记,降低标记停顿
-XX:+CMSParallelRemarkEnabled
指定使用设定的CMS垃圾回收触发阈值
-XX:+UseCMSInitiatingOccupancyOnly
老年代使用率触发GC
-XX:CMSInitiatingOccupancyFraction=70
GC时打印详细信息
-XX:+PrintGCDetails
GC时打印时间戳
-XX:+PrintGCDateStamps
指定GC日志文件目录
-Xloggc:…/logs/gc.log
首次OOM时导出堆中相关信息
-XX:+HeapDumpOnOutOfMemoryError
导出堆信息时的文件目录
-XX:HeapDumpPath=…/logs
保存ERROR错误日志到指定文件
-XX:ErrorFile=…/logs/hs_err_pid%p.log
log4j2漏洞修复
-Dlog4j2.formatMsgNoLookups=true"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值