文档章节

Java调优之jvm和线程的内存分析

自由的角马
 自由的角马
发布于 2015/01/10 13:57
字数 844
阅读 20
收藏 0
[本文地址] 本文永久地址是:http://www.mzone.cc/article/321.html

      这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立线程,我的这篇文章http://www.mzone.cc/article/311.html也有介绍的。在内存小的机器上经常出现的问题就是Cann’t allocate memory和OutOfMemoryError错误,这个要从jvm的内存结构来进行分析了。在jvm内存调整过程中,我们经常使用的参数就是:


     
  1. -Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M
  2. -Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存
  3. -Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M

      一般jvm出现Cannt’ allocate memory的错误就是机器的内存不够,导致系统无法为jvm分配给定的内存,这个在启动时犹未突出,所以会在启动参数中设置-Xms来指定;而OutOfMemoryError错误则一般会在系统运行一段情况后出现,绝大部分也是机器内存不够或是JVM本身的内存空间已被用尽,这时就要根据情况进行调整了,如果是JVM本身的内存空间用尽,则需要调整-Xmx参数来分类jvm的可用内存,如果是机器内存不够则要增加内存或是调优程序了。

      上面两个参数主要是来设置jvm的最小可用内存和最大可用内存,属于进程级别的内存控制。对于java中的线程,我之前的理解一直是在java中new新线程的时候是直接使用jvm的内存,可实际情况却不是这样的。在java中每个线程需要分配线程内存,用来存储自身的线程变量,在jdk1.4中每个线程是256K的内存,在jdk1.5中每个线程是1M的内存,jdk1.6中不太清楚,估计也是1M。在java中每new一个线程,jvm都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。这样,当操作系统的可用内存越少,则jvm可用创建的新线程也就越少,举个例子如下:

Total Memory -Xms -Xmx -Xss Spare Memory JDK Thread Count
1024M 256M 256M 256K 768M 1.4 3072
1024M 256M 256M 256K 768M 1.5 768

      上面的表格只是大致的估计了下在特定内存条件下可以在java中创建的最大线程数。随着-Xmx的加大,空闲的内存数就更少,那么可以创建的线程也就更少,同时在JDK1.4和1.5版本不同下,可创建的线程数也会根据每个线程的内存大小不同而不同。

      其实只要我们了解了JVM的内存大小指定以及java中线程的内存模型,基本上我们就可以很好的控制如何在java中使用线程和避免内存溢出或错误的问题了。

本文转载自:http://blog.csdn.net/luoweifu/article/details/17353701

自由的角马
粉丝 1
博文 269
码字总数 0
作品 0
文山
私信 提问
JVM性能调优实践——JVM篇

前言 在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践...

lijingyao8206
2018/05/24
0
0
JVM性能调优监控工具使用详解

现实企业级Java开发中,有时候我们会碰到下面这些问题: ● OutOfMemoryError,内存不足 ● 内存泄露 ● 线程死锁 ● 锁争用(Lock Contention) ● Java进程消耗CPU过高 ● ...... 这些问题...

技术小能手
2018/10/30
0
0
JVM学习总结五——性能监控及故障处理工具

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

oO脾气不坏Oo
2014/03/16
273
0
JVM系列篇:JVM性能调优的6大步骤,及关键调优参数详解

本系列会持续更新。 一、JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个...

mikechen优知
03/26
245
0
成为Java GC专家(5)—Java性能调优原则

这是“成为Java GC专家”系列的第五篇文章。在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同的GC算法流程、GC的工作原理、新生代(Young Generation)和老年代(Old Generation)的...

stefanzhlg
2014/12/05
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件69-代码行数统计

一、前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行、注释行、代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计。写完这...

飞扬青云
26分钟前
4
0
驰骋工作流引擎-ccflow关于 “ 是否自动计算未来的处理人”的功能变更

关键字:流程未来节点处理人 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 业务背景:一个流程在启动起来后,是可以对一些节点计算出来处理人是谁,流程的走向。对于另...

孟娟
42分钟前
5
0
IT兄弟连 HTML5教程 HTML5表单 HTML表单设计1

表单是PHP程序中最常使用的收集站点访问者信息的数据输入界面。通过表单浏览器获取用户的输入数据,并传送给Web服务器的脚本程序中,以各种不同的方式进行处理。在表单中提供了多种输入方式,...

老码农的一亩三分地
43分钟前
4
0
武者Vue

本文转载于:专业的前端网站➼武者Vue 1 - Introduction2 - The Vue Instance3 - Data & Methods4 - Data Binding5 - Events6 - Event Modifiers7 - Keyboard Events8 - Two-Way Data......

前端老手
49分钟前
6
0
uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
59分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部