java堆外内存溢出_JVM 案例 - 堆外内存导致的溢出错误

案例

一个网站为了实现客户端实时从服务端接收数据,使用了 CometD 1.1.1 作为服务端推送框架,服务器是 Jetty7.1.4,CPU i5,内存 4G,操作系统 32位Windows。

服务端常常抛出内存溢出异常,管理员把堆开到最大(32位系统最多到1.6G),但问题依旧。

开着 jstat 观察,GC并不频繁,eden、survivor、老年代、永久代的内存都很正常,没有压力。

查看日志中有异常信息:

...

java.lang.OutOfMemoryError:null

...

at java.nio.DirectByteBuffer ...

原因

这是由 Direct Memory 不足引起的。

操作系统对每个进程能管理的内存是有限制的,32位windows的限制是2G,其中1.6G给了Java堆,但 Direct Memory 是不计入这 1.6G的,因此 Direct Memory 最大就是 0.4G。

垃圾回收时,虽然会对 Direct Memory 进行回收,但不像新生代、老年代那样,发现空间不足时就触发回收,只能等老年代满了之后 full gc 时,随便把 Direct Memory 清理一下,否则只能等抛出异常后进行catch,调用 System.gc()。

这个案例中使用了 CometD,有大量的 NIO 使用 Direct Memory,所以产生了这个问题。

总结

我们平时对堆比较关注,但一定要记得,除了堆之外,下面这些区域也会占用较多的内存,需要注意:

Direct Memory

可以通过 -XX:MaxDirectMemorySize调整大小,内存不足时抛出 OutOfMemoryError或者OutOfMemoryError:Direct buffer memory

线程堆栈

可通过 -Xss调整大小,内存不足时抛出 StackOverflowError(纵向无法分配,即无法分配新的栈帧)或者OutOfMemoryError:unable to create new native thread(横向无法分配,即无法建立新的线程)

Socket 缓存区

每个socket连接都有 receive 和 send 两个缓存区,分别占大约 37K 和 25K,连接多时占用的内存也很可观,如果无法分配,抛出异常 IOException: Too many open files 。

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

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

相关文章

java mail outlook_已启用Outlook API邮件与邮箱用户

一个非常微妙的问题,也许是特定的环境 . 我正在尝试使用Outlook 2010 API从启用邮件的用户中识别邮箱用户 . 我们在Notes to Exchange迁移期间使用Dell Quest迁移工具,它是一个流动的项目 . 仍处于原型阶段,因此使用VB宏来最终将在C&#xff…

oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数。下面是详细情况说明&am…

mysql dump工具升级_MySQL数据库升级

当前不少系统的数据库依旧是MySQL5.6,由于MySQL5.7及MySQL8.0在性能及安全方面有着很大的提升,因此需要升级数据库。本文通过逻辑方式、物理方式原地升级来介绍MySQL5.6 升级至MySQL5.7的方法,并介绍其使用场景。1. 逻辑方式升级逻辑方式升级…

java int 128 ==_为什么 Java Integer 中“128==128”为false,而”100==100“为true?

这是一个挺有意思的讨论话题,让我们用代码说话吧!运行下面的代码:Integer a 128, b 128;System.out.println(a b);Integer c 100, d 100;System.out.println(c d);你会得到:falsetrue基本知识:我们知道,如果两个引用指向同一个对象&…

mysql课程表学时_Mysql 巩固提升 (学生表_课程表_成绩表_教师表)

方便Mysql 巩固提升创建表并插入数据:-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,sname varchar(32) DEFAULT NULL,s…

初始java_第一章__初始JAVA

1.java的三个发展方向:JAVASE(面向对象、API、JVM)、JAVAME(移动设备、游戏、通信)、JAVAEE(JSP、EJB、服务)2.开发JAVA的程序步骤:1.编写源程序 2.编译 3.运行3.JDKJRE开发工具下载java环境jdk 安装并配置环境变量,.安装直接下一步下一步直到…

python最常用的版本、也称为classic_2021年中国大学《创新思维与创业》单元测试答案...

2021年中国大学《创新思维与创业》单元测试答案被人们称为 “寒地水稻第一人”的是袁隆平答:错地图数据的基本特征包括答:时间属性 空间定位属性 地理属性对卖方征税导致商品价格上升答:√( )是在床榻上使用的一种矮形家具。答:炕…

java 泛型 继承_java基础之泛型的继承

关于泛型的基本介绍和理解请参考以下几篇文章&#xff0c;或查询更多资料&#xff1a;本篇以简单的List<>方式来进行说明。ArrayList继承了List,ArrayList没有继承ListList>等价于List extends Object>请参考以下代码&#xff1a;/*** author Ding Chengyun* 2014-…

appium java环境_Appium环境搭建(Windows版)

注&#xff1a;appium安装到C盘&#xff0c;node.js安装到C盘一、安装node.js1、到官网下载node.js&#xff1a;https://nodejs.org/en/download/2、获取到安装文件后&#xff0c;直接双击安装文件&#xff0c;根据程序的提示&#xff0c;完成nodejs的安装。3、安装完成后&…

ci mysql pdo_CI框架中pdo的使用方法

1、配置文件修改application/config文件夹下的database.php文件 $db[default] array(dsn > mysql:dbnameci_ecshop;host127.0.0.1,username > root,password > ,dbdriver > pdo,2、查询操作$sql select * from aaa where id :id;$sql_array array(:id > …

ie11加载java插件_IE浏览器中ActiveX插件的使用

在某些行业的B/S应用系统中会不可避免的要用到ActiveX浏览器插件&#xff0c;而ActiveX插件只能在IE内核浏览器中运行&#xff0c;而常用的IE浏览器的版本众多&#xff0c;从IE6到IE11&#xff0c;总共有6个版本&#xff0c;这就给开发的应用系统造成了不小的困扰&#xff1a;如…

netty java开发文档_Netty简明教学文档

写个简单点&#xff0c;比较小白的文档&#xff0c;言语比较接地气Netty是什么&#xff1f;NIO的高层封装&#xff0c;NIO很难写&#xff0c;所以有了Netty&#xff0c;方便异步的操作service的主要代码片段public void run() throws Exception {EventLoopGroup bossGroup new…

mysql 全局不重复_php uniqid() 通过MYSQL实现全局不重复的唯一ID

看了国外文章&#xff1a;https://jason.pureconcepts.net/2013/09/php-convert-uniqid-to-timestamp/ 不想写&#xff50;&#xff48;&#xff50;脚本uniqid()处理&#xff0c;想到用mysql一次性把数据库的ID改过来的方法&#xff0c;所以开始了以下研究方法一: 效率最高&…

java接口允许ajax访问_服务允许AJAX请求,允许跨域请求

当工作时间&#xff0c;因为需要JS 进行AJAX请求&#xff0c;这时候存在跨域问题&#xff0c;当出现这种情况时&#xff0c;有多种方案解决比如使用JSONP&#xff0c;也有一种简单的方式&#xff0c;就是在过滤器里面增加返回请求允许跨域head配置。代码如下&#xff1a;/**** …

mysql的增_MySQL之增_insert-replace

MySQL增删改查之增insert、replace一、INSERT语句带有values子句的insert语句&#xff0c;用于数据的增加语法&#xff1a;INSERT [INTO] tbl_name[(col_name,...)]{VALUES | VALUE} (expr ,...),(...),...①用来把一个新行插入到表中②为和其它数据库保持一致&#xff0c;不要…

python manager详解_python 多进程共享全局变量之Manager()详解

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。但当使用Manager处理list、dict等可变数据类型时&#xff0c;需要注意一个陷阱&#xff0c;即Manager对象无法监测到它引用的可变对象值的修改&#xff0c…

java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

我知道这个问题here&#xff0c;但是我有一个稍微不同的问题。如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行&#xff0c;那么最有效(就开销而言)进行编码。我考虑过:boolean wasInterrupted false;while (System.current…

PHP微信app接口退款,10.PHP接入微信退款接口

推荐文章摘要环境搭建开启配置服务器环境核心类验证回复拓展推荐文章今天网上和朋友圈炸开了锅&#xff0c;原因是微信小程序正式上线了。吃瓜群众表示不理解&#xff0c;于是去搜了下。不搜不要紧&#xff0c;搜了吓一跳&#xff0c;原来微信小程序早在2016年9月份就已经进行了…

java线程读取流的时候卡死,java – 线程中断没有结束阻塞调用输入流读取

我正在使用RXTX从串口读取数据.读取是在以下列方式生成的线程内完成的&#xff1a;CommPortIdentifier portIdentifier CommPortIdentifier.getPortIdentifier(port);CommPort comm portIdentifier.open("Whatever", 2000);SerialPort serial (SerialPort)comm;..…

php poi,GitHub - satthi/poi-php: poi-php

poi-phpvarsion 0.1(2013/10/21)このプラグインはJavaのpoiをPHPから叩いてエクセルを入出力するプラグインです。必須要件jdk1.7.0_40poi-3.9opencsv-2.3使い方①poi-phpを任意の場所に設置②PHPを記述//デフォルト読み込みrequire_once(poi-php.phpのディレクトリパス);$this…