Java虚拟机了解
本文目录:
1、Java内存结构 2、堆内存构成 3、垃圾回收算法、垃圾收集器选择 4、Java对象分配 5、Java虚拟机常用参数设置以及调优
1、Java内存结构
1.1、方法区(永久代perm space) 1.2、虚拟机栈(线程栈、方法栈帧、局部变量,线程之间数据隔离,所谓的“线程本地栈”) 1.3、本地方法栈(native method本地方法调用相关)、程序计数器(线程方法执行需要分别维护一个计数) 1.4、堆内存(新生代、老年代)
2、堆内存构成
新生代分为Eden、S0、S1区,垃圾回收使用copying复制算法;老年代为old space,垃圾回收使用标记清除算法。
堆内存垃圾回收总结为:新生代new存活对象少,使用copying复制算法回收;老年代垃圾少,绝大部分对象存活周期长,使用标记压缩算法回收。
3、垃圾回收算法、垃圾收集器选择
3.1、什么是垃圾?
String str = new String("hello world"); str=null;没有任何引用的对象为垃圾。
3.2、垃圾回收算法有哪些?
垃圾回收算法分为:标记清除(缺点:产生内存碎片)、复制算法(优点:效率高;缺点:内存浪费,内存利用率不高)、标记压缩算法(效率比标记清除略低;使用在老年代垃圾回收)。
3.3、如何判定对象为垃圾?
判定对象为垃圾,不使用引用计数方式(因为存在循环计数)而使用GC Roots正向可达方式。
3.4、垃圾收集器选择
垃圾收集器选择?serial collector单线程;parallel collector并发量大、不过每次垃圾回收,JVM需要停顿;CMS collector并发分块收集,停顿时间短;G1 collector下一代垃圾回收器,不仅停顿时间短,并且并发量大,Java9里边可能会作为默认垃圾回收器使用。
4、Java对象的分配
4.1、Java对象的分配分为栈上分配(线程私有小对象、无逃逸、支持标量替换、无需调整默认开启)
4.2、线程本地分配TLAB(小对象、占用Eden,默认1%、多线程的时候不用竞争Eden就可以申请空间,提高效率、无需调整默认开启)
4.3、老年代(大对象)
4.4、Eden新生代
5、Java虚拟机常用参数设置以及调优
5.1、JVM参数规则说明
- 标准参数;-X 非标准参数;-XX 不稳定参数,下一个版本可能会取消。比如查看Java版本命令为:java -version。
5.2、JVM常用参数设置
5.2.1、堆设置
-Xms 初始化堆大小 -Xmx 最大堆大小 -Xss 线程栈大小 -XX:NewSize=n 设置年轻代大小 -XX:NewRatio=n 设置年轻代和老年代的比值,如,3表示年轻代:老年代为1:3 -XX:SurvivorRatio=n 年轻代中Eden区与两个survivor区的比值,注意survivor区有两个,如,3表示Eden:survivor为3:2,一个survivor占整个年轻代的1/5 -XX:MaxPermSize=n 设置持久代(方法区或永久代)大小
5.2.2、收集器设置
-XX:+UseSerialGC 设置串行收集器,单线程版本,开发使用,不用于生产环境 -XX:+UseParallelGC 设置并行收集器,并发量大,停顿稍微久 -XX:+UseConcMarkSweepGC 设置并发收集器(并发量大,分块处理),停顿短
5.2.3、垃圾回收统计信息
-XX:+PrintGC -XX:+PrintGCDetails -Xloggc:filename
5.2.4、内存分配、内存溢出设置
-XX:+HeapDumpOnOutOfMemoryError 堆内存溢出,做dump处理 -XX:+HeapDumpPath=c:\tmp\jvm_dump.bin -XX:-DoEscapeAnalysis -表示不做逃逸分析,对象不在栈中分配(默认开启逃逸分析,小对象分配选择优先级为:线程栈、TLAB线程本地应用缓冲区、大对象放在老年代、其它绝大部分对象放在Eden区) -XX:-EliminateAllocations 不做标量替换,对象不在栈中分配 -XX:-UseTLAB -表示对象不在线程本地应用buffer缓冲区分配,TLAB使用Eden内存,默认1%占比
5.3、Tomcat JVM优化配置
set JAVA_OPTS= -server -Xms2g -Xmx2g -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M // JDK1.8已经废弃该配置 -XX:MaxPermSize=300M // JDK1.8已经废弃该配置 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=1g -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC 使用CMS缩短响应时间,并发收集,低停顿 -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -XX:SurvivorRatio=10 -XX:+UseParNewGC 并行收集新生代的垃圾 -XX:ParallelGCThreads=4 -XX:+CMSParallelRemarkEnabled 在使用UseParNewGC的情况下,尽量减少mark的时间 -XX:+UseCMSCompactAtFullCollection 使用并发收集器时,开启对老年代的压缩,减少内存碎片 -XX:LargePageSizeInBytes=128m 内存分页大小对性能的提升 -XX:+UseFastAccessorMethods get/set方法转成本地代码 -Xloggc:/tmp/logs/gc.log 存放gc日志 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/logs/java.hprof
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY