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 命令查看堆栈一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/116847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven入门教程(三):Maven语法

视频教程:Maven保姆级教程 Maven入门教程(一):安装Maven环境 Maven入门教程(二):idea/Eclipse使用Maven Maven入门教程(三):Maven语法 Maven入门教程(四):Nexus私服 Maven入门教程(五):自定义脚手架 6.Mav…

【vue】this.$nextTick解决this.$refs undefined的问题

说明 1、发邮件页面分成两个部分:模态框页面(头部和底部)和form页面(操作按钮) 2、点击回复按钮,要将发件人信息带到模态框页面,给定默认值且禁止收件人下拉选择(多个邮箱&#xff…

数据库(MySQL)的存储过程

一、存储过程介绍 存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff0…

基于白鲸算法优化的BP神经网络(预测应用) - 附代码

基于白鲸算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于白鲸算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.白鲸优化BP神经网络2.1 BP神经网络参数设置2.2 白鲸算法应用 4.测试结果:5.Matlab代码 摘要…

探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。

文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专…

Leetcode110. 平衡二叉树

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 题解&#xff…

工控上位机程序为什么只能用C语言?

工控上位机程序并不只能用C#开发,实际上在工业自动化领域中,常见的上位机开发语言包括但不限于以下几种:C#: C#是一种常用的编程语言,在工控领域中被广泛使用。它具有良好的面向对象特性和丰富的类库支持,可以实现高性…

MySQL - 函数

1 什么是函数? 要想实现上面的这些效果,就得借助于MySQL当中的内置函数。 函数:是指一段可以直接被另一段程序调用的程序或代码。 MySQL当中内置了很多的函数,根据其操作的数据类型,分为以下四类: 字符串…

pdf转换成图片免费软件用哪个?pdf转换成图片就用它

随着技术的发展,现在企业办公运用到的电子文档各种各样,我们日常需要掌握的技能越来越高要求,其中pdf和图片是我们经常接触的文件格式之一,而且这两个文件格式我们会经常将它们进行转换,那么pdf转换成图片怎么操作呢?…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL,MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable? OpenHarmony 组件复用机制 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为 系统组件,由开发者定义的称为 自定义组件。 在进行 UI 界面开发时,通常不是简单的将系统组件进行组合…

网站搭建最简化的引导操作 | 云服务器的购买选用 | 域名的选用 | 网站的上线和备案。

本文章面向对象为网站搭建的初次操作者,主要是一些自主使用的网站,为小白做为引导的教程。 一, 网站搭建的流程 1,服务器的租赁 2,购买域名 3,对域名进行备案 4,网站内部的搭建,上线…

音视频开发常用工具

文章目录 前言一、VLC 播放器1、简介2、下载3、VLC media player4、VLC 打开网络串流5、VLC 作为流媒体服务器①、搭建 RTSP 流媒体服务器②、新建播放器 二、MediaInfo1、简介2、下载3、MediaInfo①、主界面②、主要功能特点③、使用方法④、Mediainfo 相关参数和含义简介 三、…

uniapp热更新

首先热更新需要wgt包; 其次先了解这两个组件 下载的方法 安装的组件 场景: 当你项目的js文件或者页面文件或者静态图片文件css文件更新的时候可以走热更新; 而当你安装新的组件插件或者开启新的权限等功能的时候就无法通过热更新进行更新了…

数据结构入门 — 队列

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。 博客主页&am…

开发指导—利用CSS动画实现HarmonyOS动效(一)

注:本文内容分享转载自 HarmonyOS Developer 官网文档 一. CSS 语法参考 CSS 是描述 HML 页面结构的样式语言。所有组件均存在系统默认样式,也可在页面 CSS 样式文件中对组件、页面自定义不同的样式。请参考通用样式了解兼容 JS 的类 Web 开发范式支持的…

002图的基本概念与表示方法

文章目录 一. 图的组成二. 本体图2.1 什么是本体图2.2 怎么设计本体图 三. 图的种类3.1 按连接是否有向分3.2 按本体图分3.3 按连接是否带权重分 四. 节点连接数(节点的度)4.1 无向图节点的度4.2 有向图节点的度 五. 图的表示方法5.1 邻接矩阵5.2 连接列…

【ES6】Promise.all用法

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。 const p Promise.all([p1, p2, p3]);上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调…

新版Mongodb(6.0以上)找不到mongo.exe

安装目录下/bin目录中,没有mongo.exe文件,只有mongod和mongos,以及一个powershell命令脚本。 原因在于,mongodb6.0以后做出了重大改变,mongodb已经不再默认为你安装shell工具,因此需要安装一个额外的shell…

15年检测生涯转瞬即逝,复旦MBA助力邢国芒实现质量强国梦

日月光华,旦复旦兮!复旦MBA如同一个巨大的磁场,吸引了诸多来自五湖四海、各行各业的职场精英。从初入职场的青涩懵懂到如今的独当一面专业干练,他们逐渐成长为职场的中坚力量,在各自领域内发光发热。作为新时代的青年&…