JVM简单个人总结

举报
col127 发表于 2021/11/04 17:15:28 2021/11/04
【摘要】 一、JVM分区1、方法区是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。2、堆A、是jvm内存中最大的一块,在虚拟机启动时开辟,存放所有数组和对象实例B、分为新生代和老年代3、程序计数器A、保存当前线程正在执行的字节码指令的地址B、一个线程有一个程序计数器,会记住线程的运行,不然线程挂起后就不知道在 干嘛了,只有run方法虚拟...

一、JVM分区


1、方法区

是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2、堆

A、是jvm内存中最大的一块,在虚拟机启动时开辟,存放所有数组和对象实例

B、分为新生代和老年代

3、程序计数器

A、保存当前线程正在执行的字节码指令的地址

B、一个线程有一个程序计数器,会记住线程的运行,不然线程挂起后就不知道在 干嘛了,只有run方法

虚拟机栈
里面有很多栈帧,一个方法一个栈桢,每个栈帧存(局部变量表、操作数栈、 动态链接、出口)
局部变量表:8个基本数据类型、对象引用地址、return类型
操作数栈:进行运算的
动态链接:存放对其他方法的引用链接
出口:正常return,不正常抛异常
本地方法栈
方法上带native关键字,c和c++的
Java内存结构
判断对象是否存活
引用计数法:对象在创建时,有计数器,有引用指向就+1,没有引用指向了就 会认为是垃圾,实现简单效率高,但是无法解决循环引用的问题
可达性分析算法,现在jvm使用的算法
当一个对象到root下没有引用链是为垃圾对象
GC root:虚拟机栈、静态引用的对象、常量引用的对象、本地方法引用的 对象
优点:解决循环引用的问题
2、垃圾回收机制,简称GC

程序运行中会有大量内存垃圾,虚拟机会不定时进行GC
JVM堆分为新生代和老年代,新生代分为Eden、From Survivor、To Survivor区, 这样能更便于虚拟机管理内存。
新生代与老年代的内存比值为1:2,(–XX:NewRatio 来指定)
Eden:From:to = 8:1:1,( 可以通过参数 –XX:SurvivorRatio 来设定 ),所 以新生代中有90% 可以使用的内存。
对象会先在Eden区,当新生代内存不够时,经过一次minor GC,存活下来的 对象转入survivor区,每一次gc存活下来,年龄+1,默认15后转入老年代
持久代(永久代)就是方法区,存放常量、静态变量和类信息,难以回收
3、垃圾回收算法

A、引用计数法:当引用为0时,回收,优缺点同上被认为垃圾的对象

B、标记-清除算法:标记就是上面说认为是否为垃圾,清除是进行清除,老年代应 用多。

C、标记-整理算法:同上,但是清除后会将可用的内存“整理”到一起,老年代使 用,解决内存碎片化问题,但是移动对象,需要更新引用。

D、复制算法:和C相似,区别在于用两块内存空间,适合survivor区两块

E、JVM参数

全局可在idea包的bin目录下的idea.exe.vmoptions里配置保存

调优总结,参考别人

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。