Java堆空间,本机堆和内存问题

最近,我在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多。

代码创建的所有Java对象都是在Java堆空间内创建的,其大小由-Xmx选项定义。 但是一个Java进程由很多空间组成,而不仅仅是Java堆空间。 以下是组成Java进程的一些空格:

  • 加载的库(包括jar和class文件)
  • Java堆的控制结构
  • 线程栈
  • 生成的(JITed)代码
  • 用户本机内存(在JNI中分配)
  • … 更多…

在32位体系结构系统中,总进程大小不能超过4GB。 因此,一个32位的Java进程由许多空间(Java堆,本机内存(C-Heap)和其他空间)组成,并且其分配的空间不能超过4GB。

假设在32位生产系统上长时间运行具有-Xmx 1.5 GB(Java堆设置为1.5 GB)的Java应用程序服务器,并且已部署了许多应用程序。 一段时间后,客户希望在同一应用程序服务器上部署更多应用程序。 系统运营商了解,由于服务器将不得不处理更多的请求,因此还需要创建更多的对象并进行更多的处理。 因此,作为将来的解决方案,运营商决定将Java进程的最大堆增加到2 GB。

好的,这看起来是个好方法,但是实际上在此生产应用程序服务器上发生了什么? (这是真实情况)。 应用程序服务器因OutOfMemoryError崩溃! 您能考虑一下可能的原因吗?

我的第一个想法是2 GB的内存不足以支持所有这些应用程序。 不幸的是,问题出在别的地方。 您现在怎么看? 我会帮你一点。

java.lang.OutOfMemoryError: requested 55106896 bytes for Chunk::new.

真正的原因是,对于本机(C-Heap)内存,需要已部署的(旧)应用程序太大。 在操作员增加堆大小(从1.5GB到2 GB)之前,他们没有监视旧应用程序所需的本机内存空间。 此操作的副作用是自动将Java进程本机内存的可用最大大小从2.5 GB减小到2GB。 由于旧的应用程序已经使用了如此大的本机内存,因此此更改会使服务器崩溃 !!!

在这种情况下,唯一可以接受的解决方案是避免增加最大堆大小,部署新应用程序并减少吞吐量。 这不是一个完美的解决方案,但这是在这种情况下唯一可行的解​​决方案(因为我们的Java进程必须为32位)。

特别是在32位系统中,在增加Java堆大小之前,请注意Java进程本机内存的所需大小。 如果您处于这两个空间冲突的情况,那么解决方案可能并非如此简单。 如果您不能更改代码来克服这种情况,那么最常见的解决方案是移至最大进程大小限制太大的64位系统。

有四件事要记住:

  • 进程大小的最大限制
  • Java进程的大小不仅由Java堆组成
  • 无法明确配置Java进程的本机(C-Heap)内存的大小,因为Java堆空间可以实现
  • 应用程序所需的Java堆空间和本机(C堆)内存空间的大小仅由应用程序定义,并且这两个空间之间没有任何标准比率

参考:来自 Java的JCG合作伙伴 Adrianos Dadis的Java堆空间,本机堆和内存问题 ,集成和源博客的优点 。

翻译自: https://www.javacodegeeks.com/2013/01/java-heap-space-native-heap-and-memory-problems.html

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

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

相关文章

mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束

一、视图本质上相当于一张**“虚拟表”**,可当作独立的一张表进行操作(增、删、改、查)** 作用:**** a)**可通过权限控制,只将“表中的少数列”暴露给数据库用户,而不让该用户直接操纵数据库中“实际表”** b)**…

Software Development Life Cycle

转载于:https://www.cnblogs.com/genezhao/p/6879848.html

python中 的用法_详解python中@的用法

python中的用法 是一个装饰器,针对函数,起调用传参的作用。 有修饰和被修饰的区别,function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义)。 代码1 结果1 Its fun…

ArrayAndString(数组和字符串)

1.实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该怎么处理? public class UniqueChars {public static void main(String[] args) {// TODO Auto-generated method stubString string "abcdef…

MyBatis教程– CRUD操作和映射关系–第2部分

为了说明这一点,我们正在考虑以下示例域模型: 会有用户,每个用户可能都有一个博客,每个博客可以包含零个或多个帖子。 这三个表的数据库结构如下: CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_incr…

position 的属性值

理论上来说,全部 position 的取值有8个 包括:position:static | relative | absolute | fixed | sticky | initial | inherit | unset 其中最常用的是 static 、relative、absolute、fixed 和 sticky initial、inherit、unset 是css的关键…

[ JavaScript ] JavaScript 实现继承.

对于javascript中的继承,因为js中没有后端语言中的类式继承。所以js中的继承,一般都是原型继承(prototype)。 function P (name){this.name name;this.say function(){console.log(p);} }function S (name,id){this.id id;this.eat function(){conso…

mysql数据库应用的权限层级_MySQL数据库的用户权限管理

嗨!各位小伙伴今天翻了一下历史记录MySQL 数据库还有点内容今天开始我们就来补上吧~用户权限管理伙伴们要知道,在数据库方面有两个方向。一个是数据库管理员(Database Administrator)简称DBA,一个是数据库开发工程师(Database Developer)&…

linux i2c adapter 增加设备_Linux驱动之I2C驱动架构

一、Linux的I2C体系结构主要由三部分组成:(1) I2C核心提供I2C控制器和设备驱动的注册和注销方法,I2C通信方法,与适配器无关的代码以及探测设备等。(2) I2C控制器驱动(适配器)(3) I2C设备驱动二、重要的结构体i2c_adapter//i2c控制器(适配器)i…

Alpha-end

前言 失心疯病源10团队代码管理github个人感悟 肝不动了,肝不动了。明天如果见不到我,不要太想我。站立会议 队名:PMS530雨勤(组长) 今天完成了那些任务 熬夜肝代码代码签入github明天的计划 肝到凌晨还剩下哪些任务 团…

html 01前沿-web介绍

1. 认识网页 网页主要由文字、图像和超链接等元素构成。当然,除了这些元素,网页中还可以包含音频、视频以及Flash等。 2. 浏览器(显示代码) 浏览器是网页显示、运行的平台,常用的浏览器有IE、火狐(Firefox…

避免写慢SQL

最近在整理数据库中的慢SQL,同时也查询了相关资料。记录一下,要学会使用执行计划来分析SQL。 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同…

为什么子孙后代会讨厌使用java.util.Stack

在我用无意义的重言式杀死你之前,这是要点 如果您的应用程序接近实时,或者将代码发送到Mars,则需要保留Java中默认的Stack实现。 根据LinkedList编写您自己的版本。 同样,如果您的应用程序是关键任务,并且希望堆栈由…

play 连接mysql_Play framework 2.x 连接mysql | 学步园

笔者所使用的系统为64位 windows7。本文假设java1.5版本以上环境已经搭好,play 框架已经下载至本地。首先我们创建一个项目。命令行进入play的目录命令:play new demo再次输入项目名字输入2 选择java项目创建完成界面OK,一个play框架下的java…

rpm -e --nodeps_微课 | rpm的思维导图

前导课程:微课 | rpm的查询、升级与卸载命令本次微课将演示使用xmind绘制rpm思维导图的过程,包括视频文字,大约需要你10分钟。另外,文末还有一则IT冷笑话,学习之余、会心一笑:)这个思维导图将包含以下内容:…

CentOS7搭建lamp环境

Mysql安装 CentOS 7 版本将MySQL数据库软件从默认的程序列表中移除,用mariadb代替了。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后&#x…

border-sizing属性详解和应用

box-sizing用于更改用于计算元素宽度和高度的默认的 CSS 盒子模型。它有content-box、border-box和inherit三种取值。inherit指的是从父元素继承box-sizing表现形式,不再冗赘。1. 属性讲解 content-box 默认值,也是css2.1中的盒子模型。在计算 width和…

Couchbase:使用Twitter和Java创建大型数据集

在播放/演示Couchbase或任何其他NoSQL引擎时,创建大型数据集的一种简单方法是将Twitter feed注入到数据库中。 对于这个小应用程序,我正在使用: Couchbase Server 2.0服务器 Couchbase Java SDK (将由Maven安装) T…

查找标题已知的窗口句柄,遍历窗口控件句柄

有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow. 其函数原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以…

西门子scl语言编程手册_西门子SCL编程PEEK指令讲解

单词“peek”在英语中表示“偷看,瞥一眼”,在计算机编程中表示“读取数据”。在西门子SCL编程中,PEEK指令可以用来读取输入缓存区(I)、输出缓存区(Q)、位存储区(M)及数据块(DB)中的数据,常用作间接寻址。今天这篇文章,…