JVM(java 虚拟机)内存设置_JKX_geek的博客-程序员宅基地

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

一、设置JVM内存设置

1. 设置JVM内存的参数有四个:

-Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

-Xss   每个线程的Stack大小,不熟悉最好保留默认值;

2. 如何设置JVM内存分配:

(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):

java -Xmx128m -Xms64m -Xmn32m -Xss16m Test

(2)当在集成开发环境下(如eclipse)启动并使用JVM时:

a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):

  1. -vmargs  

  2. -Xms40m  

  3. -Xmx256m 

-vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。

此处设置的参数值可以通过以下配置在开发工具的状态栏显示:

在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true

修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:

  1. -debug  

  2. options  

  3. -vm  

  4. javaw.exe 

重新启动eclipse,就可以看到下方状态条多了JVM信息。

b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)

编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)

选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m

注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:

开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:

-Xmx256m -Xms64m

(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):

a. 设置环境变量:

变量名:CATALINA_OPTS

变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m

b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中的�TALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m

二、查看设置JVM内存信息

Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx

Runtime.getRuntime().freeMemory(); //当前JVM空闲内存

Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和

关于maxMemory(),freeMemory()和totalMemory():

maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;

totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;

freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而 JVM实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()。及其 设置JVM内存分配。

官方文档见:

http://docs.sun.com/source/819-0084/pt_tuningjava.html

java启动参数共分为三类;
其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

标准参数中比较有用的:

verbose 
-verbose:class
 
 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
-verbose:gc 
 输出每次GC的相关情况。
-verbose:jni 
 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

非标准参数又称为扩展参数

一般用到最多的是

-Xms512m  设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx512m ,设置JVM最大可用内存为512M。

-Xmn200m设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:

设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

 

 

-Xloggc:file
 与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
 若与verbose命令同时出现在命令行中,则以-Xloggc为准。
-Xprof

 跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了;但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX:PermSize、-XX:MaxPermSize等等;

 

首先来介绍行为参数

上面表格中黑体的三个参数代表着jvm中GC执行的三种方式,即串行、并行、并发
串行(SerialGC)是jvm的默认GC方式,一般适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿;
并行(ParallelGC)是指GC运行时,对应用程序运行没有影响,GC和app两者的线程在并发执行,这样可以最大限度不影响app的运行;
并发(ConcMarkSweepGC)是指多个线程并发执行GC,一般适用于多处理器系统中,可以提高GC的效率,但算法复杂,系统消耗较大;

 

性能调优参数列表:

 

我们在日常性能调优中基本上都会用到以上黑体的这几个属性

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JKX_geek/article/details/104679097

智能推荐

阶梯博弈小练_weixin_30613727的博客-程序员宅基地

阶梯博弈:http://blog.csdn.net/kk303/article/details/6692506poj 1704 Georgia and Bob从后往前两两绑成一对,若总数为奇数,则把最前面的棋子和边界绑定。在同一对棋子中,若对手移动前一个,你总能将后一个移动相同步数,所以一对棋子的前一个与前一对棋子的后一个之间的距离对最终结果无影响。只需考虑同一对棋子之间的空位,...

基于JSP的企业进销存管理系统_qq_q1262330535的博客-程序员宅基地_jsp进销存管理系统

介绍:基于JSP的进销存管理系统(MySQL版)1.包含源程序,数据库脚本。代码和数据库脚本都有详细注释。2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善。开发环境:Eclipse ,MySQL ,JDK1.7,Tomcat涉及技术点:MVC模式、JSP、Servlet、JDBC、HTML、JavaScript、CSS、JQUERY等程序功能:商品类别管理、商品管理、客户管理、供应商、销售管理、进货管理、库存管理、系统管理等。截图:数据库表:CREATE TABLE ad

pythonfile使用方法_Python File(文件) 方法整理_利兄的博客-程序员宅基地

open() 方法Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。open(file, mode='r')完整的语法格式为:ope...

计算机网络通信中通常使用三种交换技术,单招考试计算机网络技术期末试卷(带答案).doc..._米丝梨的博客-程序员宅基地

名姓名姓线订线号学装订江苏省××中等专业学校14-15 学年第一学期出卷人计应 1301 班《计算机网络技术》期末试卷审核人题号一二三总分得分一.选择题。(50 分,每小题1 分)12.把网络分为电路交换网、报文交换网、分组交换网属于按()进行分类。A.连接距离B.服务对象C.拓扑结构D.数据交换方式1.按覆盖的地理范围进行分类,计算机网络可以分为3类,即()。IP 上每台主机都需要用()以区分网...

python编程招生海报_怎么用ps做招生海报_weixin_39892842的博客-程序员宅基地

展开全部一、新建画布文件——新建 或者 快捷键Ctrl+N● 海报的设置如下图:● 传单的设置如下图:按确定进入操作e68a84e8a2ad62616964757a686964616f31333337616439区。二、载入图像选图很重要。喷绘海报比手绘更具备条件。所以所选的图尽量要贴近所做海报的主题。或者清新简单。能足够吸引人。颜色尽量不要太复杂太深。要注意,无论是喷绘海报还是手绘海报,字才是主...

maven常见问题处理(3-1)修改maven 默认使用的 jdk 版本_weixin_30908103的博客-程序员宅基地

Eclipse工程应设定了1.8,maven编译仍然使用1.6的解决办法解决方式有两种,一种是配置 pom.xml,一种是配置 settings.xml。方式一:settings.xml 配置打开 %maven%/conf/settings.xml 文件并编辑它(%maven% 表示 maven 的根目录):&lt;profiles&gt;&lt;profile&gt;...

随便推点

院校选择方法论_别样的人儿的博客-程序员宅基地

如何选择院校和专业?5+3 5个问题+3个参数(1)第一个问题:我能考什么专业?① 跨专业考研考研专业分为两大类:自然科学学科:理、工、农、医社会人文学科:经、管、文、法、史、教育、哲学、艺术跨专业的原则:自然科学学科可以跨社会人文学科,社会人文学科不可以跨自然科学学科,自然科学学科跨自然科学学科要看情况(如果目标专业所考主干专业课是本科学过课程,可以跨考),社会人文学科可以跨社会...

MAT for mac 软件工具的使用_C的二次方的博客-程序员宅基地_mac mat 使用

&nbsp;2. 安装下载完成之后是一个zip压缩包,双击解压,得到一个应用程序mat右键-显示包内容进到Content/MacOS/&nbsp; &nbsp;下,双击运行下图所示程序,略等一会即可正常运行。&nbsp; ...

mysql groupby php_MSSQL_Mysql中错误使用SQL语句Groupby被兼容的情况,首先创建数据库hncu,建立stud - phpStudy..._漫联教育的博客-程序员宅基地

Mysql中错误使用SQL语句Groupby被兼容的情况首先创建数据库hncu,建立stud表格。添加数据:create table stud(sno varchar(30) not null primary key,sname varchar(30) not null,age int,saddress varchar(30));INSERT INTO stud VALUES('1001','To...

完成二叉排序树的创建、查找、插入和删除操作。_weixin_57168038的博客-程序员宅基地

publicclassBinarySortTree {/*** 根结点*/privateTreeNode rootNode;/*** 获取rootNode* @return*/publicTreeNode getRootNode() {returnthis.rootNode;}/*** 创...

nodejs爬虫在linux上运行,nodejs 三种方式爬虫入门总结,_飛毛腿岡薩雷斯的博客-程序员宅基地

nodejs 爬虫总结① http.get+cheerio+iconv-lite这种方式还是比较简单的,容易理解,直接使用http的get方法进行请求url,将得到的内容给cheerio解析,用jquery的方式解析出我们要东西即可。要点:得到的结果中文乱码如何解决呢,用iconv-lite模块将得到的内容进行转码即可。http.get(options,function(result){var b...

qt调用python添加库_Qt使用C/C++扩展Python内置模块_99级封号斗罗的博客-程序员宅基地

之前和大家介绍过在C/C++中嵌入Python,本次和大家分享下使用C/C++扩展Python内置模块的方法。被扩展出来的新模块可以做两件无法直接在Python中完成的事情:一可以实现新的内置对象类型,二则可以调用C库函数和一些其他的系统调用。使用平台:ubuntu14.04、python3.5、Qt 5.5.1下面借助Qt创建一个叫libpy3extend 的Python内置模块,它可以做一个简...

推荐文章

热门文章

相关标签