文档章节

JAVA虚拟机起步-虚拟机调优

飓风2000
 飓风2000
发布于 2014/03/01 04:00
字数 851
阅读 353
收藏 6

JAVA虚拟机起步OutOfMemory问题解决记录。

   问题: JAVA虚拟机报错

    # java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
    #
    #  Internal Error (allocation.cpp:117), pid=26666, tid=2409851824
    #  Error: ChunkPool::allocate

    解决办法:

    平衡每个线程需要的内存存储器的堆栈大小,在程序内部控制线程总数量。

 

   理论:

JVM线程堆栈

  1.  应用程序中的每个线程都需要内存来存储器堆栈(用于在调用函数时持有局部变量并维护状态的内存区域)。每个 Java 线程都需要堆栈空间来运行。

  2.  根据实现的不同,Java 线程可以分为本机线程和 Java 堆栈。除了堆栈空间,每个线程还需要为线程本地存储(thread-local storage)和内部数据结构提供一些本机内存。

 

JVM堆栈大小

  1. -Xss 128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。

  2. 在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 

  3. JVM heap与JVM私有内存、JVM线程堆栈大小间的关系及平衡。

  4. 线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误.

    经验:

    JAVA开大量线程需要注意的地方有,一个是unlimit设置可以保证操作系统开启的文件数量,另一个就是需要考虑物理内存大小,最后要控制好线程总数量的上限。

   案例:

JAVA程序在实现大量Socket连接代理过程中,入口是通过异步SocketServer接口数据,开启的accept和reader可控,出口需要一个连接开启一个目标Socket(每个Socket对应一个线程)。

通常一台机器开启的线程数值为3000-5000个。个人感觉是跟物理内存有关,如果是4G的物理内存,每个线程默认开销1M空间,5000个线程会全部暂用物理内存,JAVA虚拟机在开启新线程是就会出现 java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?

 基于此案例,首先想到的是通过优化程序降低线程的数量,然后通过调整虚拟机参数降低线程占用内存数量。

 

附:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
#
#  Internal Error (allocation.cpp:117), pid=26666, tid=2409851824
#  Error: ChunkPool::allocate
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) Server VM (14.3-b01 mixed mode linux-x86 )
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp

 

在处理此问题过程中,有的文章说是需要更换jdk版本,有的说是32bit和64bit的问题。

个人来看,问题的关键是java虚拟机无法为新线程申请内存。写的程序没有控制好内存。

© 著作权归作者所有

飓风2000
粉丝 41
博文 379
码字总数 161929
作品 0
浦东
高级程序员
私信 提问
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?

[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无所知,那时候我天真地认为,JVM的出现本身就是想让程序员屏蔽实现细节,...

原创小博客
2018/07/19
309
0
《Tomcat和JVM的性能调优你真的学会了吗?》总结篇

Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容。对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建的线程数的设置...

Java干货分享
08/28
90
0
java虚拟机调优,什么时候才用到?

之前面试被问到Java虚拟机优化,一头雾水。 平时工作中,从来没用到,特地买了几本书,还有oracle的官方文档。 不过 在平时工作中还是没用到! 列位大牛、小牛和菜鸟: Java虚拟机调优,什么...

RayChiong
2014/06/30
422
3
JVM学习总结五——性能监控及故障处理工具

之前扯了四篇理论,这一篇终于可以动动手了。本篇我们将介绍JVM常用的一些工具,这些工具将是我们监控JVM状态、处理故障和调优分析的利器。 不过在开始之前,我还是要先车扯两句:工具终归只...

oO脾气不坏Oo
2014/03/16
274
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
2018/05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Knowage 6.2安装部署

注意:需要正确配置JAVA_HOME和JRE_HOME还有catalina_home,否则启动的时候tomcat一闪而过,想要获得报错信息,可以打开cmd,在dos命令行运行开始命令 官网:https://www.knowage-suite.com/s...

阿伦哥-
18分钟前
4
0
c++11 左值引用和右值引用

#include <iostream>using namespace std;void Print(string& s){ cout << s;}int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error......

SibylY
19分钟前
3
0
浅谈Facade外观模式

一、前言 外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一...

青衣霓裳
20分钟前
3
0
AnalyticDB for PostgreSQL 6.0 新特性介绍

阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。ADB PG通过行存储、列存...

Mr_zebra
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部