我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java内存模型讨论及案例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java内存模型讨论及案例分析

常用内存选项

-Xmx: 最大堆大小

-Xms:最小堆大小

-Xss :线程堆栈大小,默认1M

生产环境最好保持 Xms = Xmx

java内存研究

内存布局

在这里插入图片描述

可见:

  • 堆大小 = 新生代 + 老年代,新生代=E+From Survivor+To Survivor。新生代和老年代的比例通过-XX:NewRatio=2选项指定,新生代内部E/S0/S1的比例用-XX:SurvivorRatio=8选项指定。
  • -Xmx和-Xms设置的是堆大小,即设置的是新生代和老年代
  • M(即永久代)不算在堆里面。永久代存放的是类的元数据信息(比如类名、属性、方法、访问限制等)。动态代理生成的类定义也会存放在永久代,所以如果动态生成的类太多,永久代空间就会不够,这一点需要注意(参看这里

对于某个服务,我们通过

-Xmx256m -Xms256m

设置堆大小为256M,但服务跑起来后,通过top命令查看,它占了500M的物理内存。不要奇怪,剩下的200多M是被方法区、线程堆栈等占用了。

E/O的比例

新生代和老年代的比例默认是1:2,通过-XX:NewRatio=2选项指定,我们可通过jstat -gc命令查看结果来印证:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   16384.0 16384.0 3776.0  0.0   54272.0  28511.2   175104.0   100739.4  73816.0 70718.7 9344.0 8572.7    408    4.010   7      1.666    5.676

EC是Eden区大小,则新生代总大小为S0+S1+E=87040。

OC为老年代大小:175104,我们看到,刚好1:2的比例。

新生代到老年代的转化

新生代是 GC 收集垃圾的频繁区域。
当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳
( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。
但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。

From Survivor区域与To Survivor区域是交替切换空间,在同一时间内两者中只有一个不为空。jstat -gc结果里的S0和S1就是这2个survivor区。

方法区

方法区存放类定义和元信息,像字符串池和类的静态成员不在方法区里,而是放在堆上

Major GC 和 Full GC 的区别

Full GC:收集young gen、old gen、perm gen

Major GC:有时又叫 old gc ,只收集老年代( old gen )

Minor GC:只收集新生代(young gen)。

生产问题案例

JVM堆使用率居高不下

现象:JVM堆使用率过很久才能降下来。

原因是:程序内未做分批处理,一次性分配了大片连续内存(常见于ArrayList中),导致新生代区域不够分,所以分到了老年代。老年代只能在执行频度更低、执行速度更慢的major gc里清理,而不会在频繁执行、速度更快的minor gc里清理,所以导致JVM堆内存占用要过一段较长的时间才能看到下降。实际中遇到过2万条记录在8G内存的容器里就占用了2G堆内存的情况。

线程间歇性发呆

现象:一个函数内的两个步骤间并无耗时操作,但线程却仿佛发呆了几秒不做事

可能的原因:

  • 服务内的数据库、redis连接池耗尽,线程挂起等可用的连接;
  • cpu和内存占用率很高
  • 日志打印过多,写日志操作阻塞了线程,比如在一个2C接口里去打印异常堆栈

定位手段:

既然是线程阻塞,就用jstack命令dump出线程堆栈,查看可疑的阻塞。这跟早期C++里用gdb的thread apply all bt 命令查看堆栈一样。

来源地址:https://blog.csdn.net/tlxamulet/article/details/132562573

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java内存模型讨论及案例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java内存模型讨论及案例分析

常用内存选项 -Xmx: 最大堆大小 -Xms:最小堆大小 -Xss :线程堆栈大小,默认1M 生产环境最好保持 Xms = Xmx java内存研究 内存布局 可见: 堆大小 = 新生代 + 老年代,新生代=E+From Survivo
2023-08-30

Java内存模型的示例分析

这篇文章主要为大家展示了“Java内存模型的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java内存模型的示例分析”这篇文章吧。1. 为什么要有内存模型?要想回答这个问题,我们需要先弄
2023-06-29

jvm中java内存模型的示例分析

这篇文章主要介绍了jvm中java内存模型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、java内存模型和java内存结构有什么区别 1、java内存结构记得是
2023-06-19

Java内存模型之重排序的示例分析

小编给大家分享一下Java内存模型之重排序的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据依赖性如果两个操作访问同一个变量,而且这两个操作中有一个操作为写操作,此时这两个操作之间存在数据依赖性。数据依赖性分
2023-06-15

Golang内存模型实例源码分析

这篇文章主要介绍“Golang内存模型实例源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存模型实例源码分析”文章能帮助大家解决问题。1. 简介(Introduction)Go
2023-07-05

Java内存模型顺序一致性的示例分析

小编给大家分享一下Java内存模型顺序一致性的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和
2023-06-25

JVM系列之内存模型的示例分析

这篇文章主要介绍JVM系列之内存模型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 内存模型和运行时数据区这一章学习java虚拟机内存模型(Java Virtual machine menory mod
2023-06-15

C++技术中的内存管理:内存泄漏的典型案例分析

c++++ 中常见的内存泄漏类型包括栈泄漏、堆泄漏和全局泄漏。本文通过一个实战案例分析了堆泄漏。该示例中,一个动态分配的指针在函数返回时丢失了作用域,但分配的内存未释放,导致内存泄漏。可以使用智能指针、手动内存释放或内存检测工具来防止内存泄
C++技术中的内存管理:内存泄漏的典型案例分析
2024-05-08

Java并发编程之volatile与JMM多线程内存模型实例分析

本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”
2023-06-30

Java应用程序中内存泄漏及内存管理的示例分析

这篇文章主要介绍Java应用程序中内存泄漏及内存管理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!btw,一些静态代码扫描工具也能检测出不好的编程习惯带来潜在的内存泄露的风险。Java平台的一个突出的特性是
2023-06-02

Java内存泄露监控工具以及JVM监控工具的实例分析

Java内存泄露监控工具以及JVM监控工具的实例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。jstack -- 如果java程序崩溃生成core文件,jstack工具
2023-06-17

编程热搜

目录