Java中的堆内存设置对线程创建数的影响以及-Xss参数的记录
Java的线程对象是存储在堆上的,所以,能够创建多少个线程,受到堆空间的大小限制,同时也受到每个线程的大小的限制,假如线程对象内部有一个非常大的数组字段,那就非常影响能够创建的线程的大小
我们的例子:
class Task implements Runnable {
//5M堆内存 128k的情况下,最多创建31个线程就挂了
byte[] bytes = new byte[1024 * 128];
@Override
public void run() {
while (true) {
try {
bytes[0] = 1;
Thread.sleep(10_100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程对象内部持有一个数组字段,这个数组的大小是128k,我们的测试代码:
public static void threadTest3() {
int count = 1;
try {
while (true) {
Thread thread = new Thread(new Task());
thread.start();
System.out.println("==============================================" + count++);
}
} catch (Throwable e) {
System.out.println(count);
e.printStackTrace();
}
}
运行测试的时候,我们将堆的内存设置的小一些:
-Xmx5m -Xms5m XX:+PrintGC -XX:-PrintGCDetails
输出的日志如下:
"C:\Program Files\Java\jdk1.8.0_152\bin\java.exe" -Xmx5m -Xms5m -XX:+PrintGC -XX:-PrintGCDetails com.jiaoyiping.baseproject.concurrent.ThreadTest
[GC (Allocation Failure) 1024K->732K(5632K), 0.0006644 secs]
[GC (Allocation Failure) 1746K->1023K(5632K), 0.0012964 secs]
[GC (Allocation Failure) 1818K->1417K(5632K), 0.0005073 secs]
[GC (Allocation Failure) 2441K->1546K(5632K), 0.0008099 secs]
[GC (Allocation Failure) 2570K->1773K(5632K), 0.0009678 secs]
==============================================1
[GC (Allocation Failure) 2752K->2046K(5632K), 0.0012278 secs]
==============================================2
==============================================3
==============================================4
==============================================5
==============================================6
==============================================7
==============================================8
[GC (Allocation Failure) 2962K->3022K(5632K), 0.0007815 secs]
==============================================9
==============================================10
==============================================11
==============================================12
==============================================13
==============================================14
==============================================15
[GC (Allocation Failure) 3938K->3950K(5632K), 0.0005197 secs]
[Full GC (Ergonomics) 3950K->3132K(5632K), 0.0098480 secs]
==============================================16
==============================================17
==============================================18
==============================================19
==============================================20
==============================================21
==============================================22
[GC (Allocation Failure) 4090K->4220K(5632K), 0.0004522 secs]
[Full GC (Ergonomics) 4220K->3975K(5632K), 0.0085720 secs]
==============================================23
==============================================24
==============================================25
==============================================26
==============================================27
==============================================28
==============================================29
[Full GC (Ergonomics) 4920K->4876K(5632K), 0.0110795 secs]
[Full GC (Allocation Failure) 4876K->4856K(5632K), 0.0086577 secs]
==============================================30
[Full GC (Ergonomics) 5015K->4985K(5632K), 0.0025122 secs]
[Full GC (Allocation Failure) 4985K->4985K(5632K), 0.0022044 secs]
31
java.lang.OutOfMemoryError: Java heap space
at com.jiaoyiping.baseproject.concurrent.Task.<init>(ThreadTest.java:105)
at com.jiaoyiping.baseproject.concurrent.ThreadTest.threadTest3(ThreadTest.java:74)
at com.jiaoyiping.baseproject.concurrent.ThreadTest.main(ThreadTest.java:17)
[Full GC (Ergonomics) 5118K->4995K(5632K), 0.0108311 secs]
[Full GC (Ergonomics) 5107K->5029K(5632K), 0.0034520 secs]
[Full GC (Ergonomics) 5107K->5058K(5632K), 0.0034841 secs]
[Full GC (Ergonomics) 5107K->5064K(5632K), 0.0032645 secs]
[Full GC (Ergonomics) 5107K->5097K(5632K), 0.0034425 secs]
[Full GC (Ergonomics) 5107K->5107K(5632K), 0.0030512 secs]
[Full GC (Ergonomics) 5107K->5107K(5632K), 0.0027000 secs]
[Full GC (Ergonomics) 5109K->5109K(5632K), 0.0026329 secs]
[Full GC (Ergonomics) 5111K->5111K(5632K), 0.0026942 secs]
[Full GC (Ergonomics) 5113K->5113K(5632K), 0.0024612 secs]
[Full GC (Ergonomics) 5116K->5116K(5632K), 0.0028061 secs]
[Full GC (Ergonomics) 5118K->5118K(5632K), 0.0027730 secs]
[Full GC (Ergonomics) 5119K->5119K(5632K), 0.0039374 secs]
[Full GC (Allocation Failure) 5119K->5118K(5632K), 0.0037878 secs]
[Full GC (Ergonomics) 5119K->5119K(5632K), 0.0031486 secs]
[Full GC (Allocation Failure) 5119K->5119K(5632K), 0.0028138 secs]
当创建了30个线程的时候,就出现了堆内存的溢出
如果将bytes的值改变为56K呢,可以创建70个线程
-Xss影响的是栈的深度(比如栈的深度大的话,能够递归调用的次数就越多)
我们构造出来递归调用的例子,用来测试-Xss参数对递归调用的次数的影响
public static void threadTest4() {
try {
add(0);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
static int add(int count) {
System.out.println("invoke count" + (count + 1));
return add(count + 1);
}
当-Xss设置为128k的时候:
当-Xss设置为256K的时候:
jvm推荐的-Xss设置最少是108k,小于108K的时候,结果是不可预料的
5k-64k 无法创建虚拟机:
4k和以下很大的数值:
64K- 108K
这个值默认是1M我们一般不需要修改,值需要知道-Xss和栈的深度有关即可,通过以上的例子我们得到以下结论:堆内存的大小,和线程对象本身的大小,影响能够创建的线程的个数,-Xss影响栈的深度
除了Java虚拟机之外,操作系统也会对能创建多少个进程和线程进行限制
通过两个文件我们可以查看和修改这些限制数:
最大的PID
/proc/sys/kernel/threads-max
最多的线程数:
/proc/sys/kernel/pid_max
Java中的堆内存设置对线程创建数的影响以及-Xss参数的记录的更多相关文章
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java中的堆内存、栈内存、静态存储区
一.栈 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用.但缺点是,存在栈中的数据大小与生存 ...
- java中的堆内存和栈内存
Java把内存分成两种: 一种叫做栈内存 一种叫做堆内存 栈内存 : 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变 ...
- java中的堆与栈
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...
- Java堆内存设置
转自:https://blog.csdn.net/Qiuzhongweiwei/article/details/81023645 堆内存设置 原理 JVM堆内存分为2块:永久空间和堆空间. 永久即持久 ...
- 【转】JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM堆内存设置
今天碰到了一个题目,讲的是关于堆内存的问题,题目如下 下面哪种情况会导致持久区jvm堆内存溢出? A.循环上万次的字符串处理 B.在一段代码内申请上百M甚至上G的内存 C.使用CGLib技术直接操 ...
- JDK8中JVM堆内存划分
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址. JVM全部的对象信息都 存放在堆内存中.相比 ...
- [转]JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
随机推荐
- REST风格的增删改查(1)
一.RESTFUL风格的CRUD(增删改查)案例 1.需求: ①显示所有员工信息:URI:emps,请求方式:GET ②添加员工所有信息:显示添加页面:URI:emp,请求方式:GET, 添加员工信息 ...
- Ubuntu 18.04 安装Virtual Box or VMWare workstation Pro 14
Linux相关的知识:https://www.cnblogs.com/dunitian/p/4822808.html#linux Virtual Box:sudo apt-get install vi ...
- 发现一个强大的可视化第三方库pyecharts
pyecharts 目前尚在不断的更新中,值得重点研究和学习的图表库
- iOS 可高度自定义的底部弹框
技术: iOS Objective-C 概述 一个可以让开发者通过编写 tableView 的内容随心所欲的定制自己想要的底部弹框 详细 代码下载:http://www.demodashi.com ...
- VPS、虚拟主机、云主机的区别
引用知乎网友通俗的例子解释: 1. 小王是深圳的一拆迁户,有钱任性:自己租了一块地皮[带宽],盖了一栋10000平方的房子[服务器],计划租给别人赚钱.2. 但是10000平方的房子太大,能租起的人太 ...
- python时间模块time详解
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...
- Python读取本地文档内容并发送邮件
当需要将本地某个路径下的文档内容读取后并作为邮件正文发送的时候可以参考该文,使用到的模块包括smtplib,email. #! /usr/bin/env python3 # -*- coding:ut ...
- 【转载】MapReduce编程 Intellij Idea配置MapReduce编程环境
目录(?)[-] 一软件环境 二创建maven工程 三添加maven依赖 四配置log4j 五启动Hadoop 六运行WordCount从本地读取文件 七运行WordCount从HDFS读取文件 八代 ...
- MYSQL数据库高可用方案探究
MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master ...
- C语言 · 猜算式
题目:猜算式 看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数. 如果没有限定条件,这样的例子很多. 但目前的限定是:这9个方块,表示1~9的9 ...