Java中的内存的划分可以用下图来表示:

  

  程序计数器:每一个线程都有一个程序计数器,记录需要执行的下一条指令。

  HootSpot虚拟机中,不区分虚拟机栈和本地方法栈,统一称为栈。虚拟机栈和本地方法栈也是线程私有的,多个线程之间不会互相影响。

  虚拟机栈记录了线程的局部变量、部分结果,参与方法的调用与返回。本地方法栈用于管理本地方法,Java中的本地方法指的使用C语言实现的部分。

  堆是新对象在内存中的存储区域,也是JVM垃圾回收的主要区域。JVM的垃圾回收主要就是堆和方法区(持久代)。

  方法区主要存储的是类的元数据和一些常量数据。需要注意的是,方法区不包含在我们通常所说的堆中。方法区也成为持久代,但其中存储的数据并不是永久的,也是会被回收的。

  JVM的垃圾回收主要就是堆和方法区,需要判断对象是否还存在有效地引用,没有有效引用时,对象将被回收。程序计数器和栈所占的内存,当线程结束时,所对应的内存也就变为了无用内存。

  我们可以用-Xss指定栈的大小,栈的大小决定了方法可以调用的深度。对于方法而言,参数越多、局部变量越多,所占用内存越大,方法可以调用的深度就越小。

  应当将-Xms和-Xmx的大小设置为相等的大小,这样可以减少GC的次数和耗时。

  -Xmn可以设置新生代的大小,新生代的大小一般设置为整个堆内存的1/4-1/3。

  持久代的大小一般设置为64M或者128M就已经足够,如过发生了持久代溢出,需要使持久代支持GC。

    -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC XX:+CMSClassUnloadingEnabled的设置将使得持久代支持GC。

  如过系统确实需要支持大量线程的并发,可以设置一个较小的堆和较小的栈,这样可以支持生成更多的线程。

  新生代垃圾回收器和老年代垃圾回收器配合使用的规则如下,不是所有的都可以配合使用的。

  

  -XX:+UseParallelGC 指定在 New Generation 使用 parallel collector 并行收集, 暂停 app threads,同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用。 系统吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc。

-XX:+UseParNewGC 指定在 New Generation 使用 parallel collector,是 UseParallelGC 的 gc 的升级版本有更好的性能或者优点, 可以和 CMS gc 一起使用。

   -XX:+UseParallelOldGC:新生代和老年代都使用并行回收收集器,和-XX:+UseParallelGC一样关注的是吞吐量,交互性应用不适用。  -XX:MaxGCPauseMillis:设置停顿时间不超过多少。 -XX:GCTimeRatio:设置吞吐量大小。关注吞吐量的gc可以设置以控制吞吐量。

   -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用cms。

   -XX:ParallelGCThreads指定,一般最好与cpu数量相当。cpu小于8个时和cpu数量一样,cpu大于8个时 3+[(5*cpu/8)]。

  CMS不是独占式垃圾回收器,垃圾回收的同时,可能还会不断地产生新的垃圾。因此CMS不应等到老年代内存不足时才进行垃圾回收,而是应该通过-XX:CMSInitiatingOccupancyFracation制定回收的阈值,默认是68,即老年代的68%被占满时,CMS就开始了垃圾回收的工作。

  CMS基于的是标记-清除,没有压缩的步骤,时间久了会产生大量的碎片,因此可以设置-XX:CMSFullGCsBeforeCompaction进行多少次CMS回收之后进行一次老年代的压缩操作。

  

  -XX:PretenureSizeThreshold:设置对象大于这个大小时将不在新生代上分配,而是直接在老年代上分配。

  -XX:MaxTenuringThreshold:设置新生代需要经过多少次垃圾回收才能进入到老年代,默认值是8.

  

  当系统出现长时间的莫名其妙的停顿,就需要考虑是否是垃圾回收器的选择出现了问题。

  还可以设置一些参数,指定当jvm crash之后的一些动作。 

  1. 生成error 文件的路径:你可以通过参数设置-XX:ErrorFile=/path/hs_error%p.log, 默认是在java运行的当前目录 [default: ./hs_err_pid%p.log]

  2. 参数-XX:OnError  可以在crash退出的时候执行命令,格式是-XX:OnError=“string”,  <string> 可以是命令的集合,用分号做分隔符, 可以用"%p"来取到当前进程的ID. 例如:

     -XX:OnError="pmap %p"                // show memory map

     -XX:OnError="gcore %p; dbx - %p"     // dump core and launch debugger

 

JVM学习(二)的更多相关文章

  1. JVM学习二:JVM之GC算法和种类

    我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收 ...

  2. JVM学习二:垃圾收集(Garbage Collection,GC)机制

    JVM的GC分为两个主要部分,第一部分是判断对象是否已死(堆内存的垃圾回收占主要部分,方法区(metaspace)的内存回收在最新的官方文档中未给出详细解释,暂时不做讨论范围),第二部分是对内存区进行 ...

  3. JVM学习二:JVM之类加载器之加载分析

    前面一遍,我们对类的加载有了一个整体的认识,而这一节我们细节分析一下类加载器的第一步,即:加载. 一.概念 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区 ...

  4. JVM学习(二):垃圾回收

    我刚工作的时候问一个前辈,我们能针对JVM做出什么样的优化.前辈说,我们系统现在的性能并不需要调优,用默认的配置就能满足现在的需求了.我又问,那你为什么要看JVM相关的书呢?前辈微微一笑,悠悠地来了句 ...

  5. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  6. jvm学习二:类加载器

    前一节详细的聊了一下类的加载过程,本节聊一聊类的加载工具,类加载器  ---  ClassLoader 本想自己写的,查资料的时候查到一篇大神的文章,写的十分详细 大家直接过去看吧http://blo ...

  7. JVM学习一:JVM之类加载器概况

    18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

随机推荐

  1. Codeforces Round #343 (Div. 2)-629A. Far Relative’s Birthday Cake 629B. Far Relative’s Problem

    A. Far Relative's Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...

  2. Spring框架学习笔记——各种异常、报错解决

    一.部分标签无法使用 原因:没有util导入命名空间 解决方法:在bean配置文件头部引用命名空间 <?xml version="1.0" encoding="UT ...

  3. [国嵌攻略][099][Linux内核配置与编译]

    为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...

  4. PHP结合Ueditor并修改图片上传路径

    投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2016-10-16 我要评论 使用ueditor编辑器,附件默认在ueditor/php/upload/, 但是大家的附件地址的默认路 ...

  5. 阿里云邮箱POP3、SMTP设置教程

    3G免费网www.3gmfw.cn免费为你分享阿里云邮箱POP3.SMTP设置教程,阿里云邮箱 阿里云邮箱POP3设置 阿里云邮箱SMTP设置的相关资源如下: 什么是POP3.SMTP? 阿里云邮箱已 ...

  6. Vuthink正确安装过程

    1.      下载项目vuethink,本例将项目放置website文件下. 2.      后台搭建 本地建站–>以phpstudy为例 1)      新建站点域名 <Virtual ...

  7. 第一章 用HTML5中的结构元素构建网站

    1.当一个容器需要直接定义样式或通过脚本定义行为时,推荐使用div元素而非section元素. 2.section是需要标题的,而nav或aside没有标题也是可以的. 3.html5轮廓工具 htt ...

  8. mysql查询语句处理

    两表做链接查询,   查理处理顺序各个阶段: 1) From: 对From子句中的坐标<left_table>和右表<right_table>执行笛卡尔积,产生虚拟表T1: 2 ...

  9. mysql 中文乱码

  10. linux 动态库的符号冲突问题

    最近,给同事定位了一个符号表的冲突问题,简单记录一下. A代码作为静态链接库,被包含进了B代码,然后编译成了动态链接库,B.so A代码同时作为静态链接库,被编译进入了main的主代码. main函数 ...