JVM总结

一、对象内存布局

二、JVM内存结构

2.1 程序计数器

线程私有,是一个指针,每个命令都有行号,使用程序计数器记录命令执行到多少行,记录代码执行的位置

2.2 java虚拟机栈

线程私有,开启一个线程都会开启一个虚拟机栈,默认大小为1M,加载本地方法

2.3 本地方法栈

线程私有,与虚拟机栈类似,不过加载的是native修饰的方法

2.4 堆

线程共享,存放对象,new的对象

2.5 元空间

线程共享,存储类的信息,方法的定义,静态变量,常量池放在元空间内

java虚拟机中只存在一个堆,一个元空间,在JVM启动时创建,关闭时销毁

栈、本地方法栈、程序计数器,随线程创建而创建,随线程结束死亡

三、堆内存结构

四、GC垃圾回收

发现垃圾

  1. 引用计数算法,优点:快,缺点:无法检测出循环引用
  2. 根搜索算法:从节点GCROOT开始,寻找对应的引用节点,往下依次寻找对应的引用节点,所有引用节点寻找完毕后,剩余节点被当做垃圾处理

可作为GCRoot的对象:

  1. java虚拟机栈引用的对象
  2. 本地方法栈引用的对象
  3. 元空间中静态属性引用的对象
  4. 元空间中常量引用的对象

回收垃圾

  1. 标记-清除算法:标记需要回收的对象,统一清除。
    缺点:清除后会产生大量不连续的内存碎片
  2. 标记-整理算法:标记后将所有存活对象都移动到一端,移动过程中清理可回收对象
    优点:内存整理后不会产生大量不连续的内存碎片
    缺点:耗时耗力
  3. 复制算法:将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完,就将存活的对象复制到另一块内存,然后把使用过的内存空间清理掉。
    缺点:可使用内存少
  4. 分代收集算法:根据对象存活周期的不同将内存划分为年轻代、老年代,不同生命周期的对象可以采取不同 的回收算法,以便提高回收效率。

(1)年轻代

新生对象会放在年轻代

新生代内存按照8:1:1比例分为一个eden区和两个Survivor区
特殊情况 :当存放到Eden区的对象太大时,会直接存放到老年区,若老年区也满了,触发FullGC,年轻代和老年代全部回收

新生代发生的GC叫做MinorGC,发生频率较高

(2)老年代

当年轻代中经历了N次垃圾回收仍存活的对象放入老年代,默认15次

内存大概是年轻代的2倍,老年代满时触发MajorGC即FullGC

FullGC发生频率低,老年代对象存活时间较长,存活率较高。

(3)元空间-持久代

存放静态文件,如Java类、方法等,存储到元数据区

五、JVM调优参数

-Xms8g :设置 JVM中堆初始大小(s size)为8g,可设置与-Xmx相同,避免垃圾回收完成重新分配内存

-Xmx8g :设置堆最大(x mix)可用内存为8G

-Xmn4g :设置年轻代(n)大小为4G

-XX:MaxMetaspaceSize=128m: 设置元空间最大为为128m ,

-XX:MetaspaceSize=128m 用于设置元空间的初始大小, 默认值约21M

相关推荐
程序员zgh21 分钟前
C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)
c语言·开发语言·jvm·c++
没有bug.的程序员1 小时前
熔断、降级、限流:高可用架构的三道防线
java·网络·jvm·微服务·架构·熔断·服务注册
风景的人生6 小时前
一台电脑上可以同时运行多个JVM(Java虚拟机)实例
java·开发语言·jvm
五阿哥永琪8 小时前
JVM 类加载的过程&类加载器&双亲委派机制
jvm
想学后端的前端工程师8 小时前
【Java JVM虚拟机深度解析:从原理到调优】
java·jvm·python
oioihoii9 小时前
C++多线程中join与detach机制深度解析
java·jvm·c++
最贪吃的虎9 小时前
JVM扫盲:内存模型
java·运维·jvm·后端
图乐aj9 小时前
运维工程师技能之JVM
运维·jvm
郝学胜-神的一滴9 小时前
Linux 多线程编程:深入理解 `pthread_join` 函数
linux·开发语言·jvm·数据结构·c++·程序人生·算法
代码or搬砖10 小时前
== 和 equals() 的区别
java·开发语言·jvm