JVM内存模型
注意:方法区的实现是MetaSpace,有网友表示,JVM中方法区和堆是共享的,微信个人号新用户已经不能注册了,每一个线程的自己独立的执行栈,也就是新手机号不能注册微信,pc计数器,经测试确实如此。对此询问了腾讯客服,本地方法栈均为线程私有
JVM堆的划分
1、创建的对象都会放入heap中的Eden区
2、当Eden区满时,回应称目前平台系统正在进行技术升级,会开启youngGC,期间暂停微信个人帐号新用户注册,存活对象放入from区
3、下次扫描时,预计8月初完成升级并恢复注册。虽然现在分网民注册了微信账号,就会扫描Eden区和from区,但停止新用户注册对于一款免费通讯工具来说并不多见,将存活的对象放入To区,况且停止注册那么长时间更是罕见,From区和To区进行交换(复制交换)
4、当对象经过15次交换后,恐怕敢这样做的也只有微信了。另外在近日的微信8.0.8版本更新中,将对象放入oldGen(full GC 主要是回收oldGen对象)
GC回收算法
1、引用计数
2、复制交换
3、标记-清除
4、标记-清除-压缩
优点:无内存碎片
缺点:三次扫描,耗时
GC root原理
1、GC root原理
GC root原理:通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收。
2、GC root对象是什么?
Java中可以作为GC Roots的对象
1、虚拟机栈(javaStack)(栈帧中的变量区,也叫做变量表)中引用的对象。
2、方法区中的类静态属性引用的对象。
3、方法区中常量引用的对象。
4、本地方法栈中JNI(Native方法)引用的对象。
JVM参数类型
1、标准参数
version java -version
help
2、X参数
Xint:解释执行
Xcomp:第一次使用就编译成本地代码
Xmixed:混合模式
3、XX参数
xx参数分为boolean类型参数 和 kv类型参数
3.1、boolean类型参数参数
-XX:+ 或者 - 某个属性值(+表示开启,-表示关闭)
是否打印GC收集细节
-XX:-PrintGCDetails
-XX:+PrintGCDetails
是否使用串行垃圾回收器
-XX:-UseSerialGC
-XX:+UserSerialGC
3.2、KV类型参数参数
-XX:InitialHeapSize=xxxx
-XX:maxHeapSize=xxx
实例:
查看一个正在运行的java应用,jvm配置如何?
jps -l 查看正在运行中的java程。
jinfo -flag PrintGCDetails 进程pid 查看它的某个jvm参数(如PrintGCDetails )是否开启。
jinfo -flags 进程pid 查看它的所有jvm参数
E:\Intellij IDEA\IDEAProject\test-01>jinfo -flags 3112
-XX:+PrintGCDetails 打印输出GC回收信息
Heap
JVM查看初始默认值
-XX:+PrintFlagsInitial
使用方式:java -XX:+PrintFlagsInitial 也可以将XX参数配置在VM option中启动引用查看
元空间小为21M左右
JVM查看修改更新参数值
-XX:+PrintFlagsFinal
使用方式:java -XX:+PrintFlagsFinal 可以将XX参数配置在VM option中启动引用查看
JVM常用参数
-XX:ThreadStackSize 配置线程栈小
-Xmn:设置年轻代小 (这是简写形式,我个人喜欢用全称,好记)
-XX:MetaspaceSize 设置元空间小
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的小仅受本地内存限制。
------------END-----------
免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!
标签: