JVM学习(二)
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学习(二)的更多相关文章
- JVM学习二:JVM之GC算法和种类
我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收 ...
- JVM学习二:垃圾收集(Garbage Collection,GC)机制
JVM的GC分为两个主要部分,第一部分是判断对象是否已死(堆内存的垃圾回收占主要部分,方法区(metaspace)的内存回收在最新的官方文档中未给出详细解释,暂时不做讨论范围),第二部分是对内存区进行 ...
- JVM学习二:JVM之类加载器之加载分析
前面一遍,我们对类的加载有了一个整体的认识,而这一节我们细节分析一下类加载器的第一步,即:加载. 一.概念 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区 ...
- JVM学习(二):垃圾回收
我刚工作的时候问一个前辈,我们能针对JVM做出什么样的优化.前辈说,我们系统现在的性能并不需要调优,用默认的配置就能满足现在的需求了.我又问,那你为什么要看JVM相关的书呢?前辈微微一笑,悠悠地来了句 ...
- JVM学习--(二)内存模型、可见性、指令重排序
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...
- jvm学习二:类加载器
前一节详细的聊了一下类的加载过程,本节聊一聊类的加载工具,类加载器 --- ClassLoader 本想自己写的,查资料的时候查到一篇大神的文章,写的十分详细 大家直接过去看吧http://blo ...
- JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- bzoj usaco 金组水题题解(1)
UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT. ...
- HDU--2015
偶数求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- DOM解析原理示意
DOM解析原理示意
- c++---天梯赛---查验身份证
★题目: ★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码.之后进行进一步的判断把错误的身份证号码输出.如果全部正确输出All passed. ★思路方法: ①按题目要求输入. ②对前1 ...
- tp路由+伪静态+去掉index.php
浏览:10536 发布日期:2013/10/08 分类:技术分享 关键字: 路由 伪静态 去掉index.php 之前一个网友说能不能达到这样的效果,www.olcms.com/news/id.htm ...
- 用PHPMailer在本地win环境,可以接收到邮件和附件,但在linux环境只能接收邮件信息接不到附件,是我的路
解决了,Linux区分大小写问题
- IOS 使用 ZbarSDK 二维码扫描
1. 下载SDK https://github.com/bmorton/ZBarSDK 2. 引用到项目中 3. 添加引用 4. AppDelegate中添加下面代码 5. 在需要使用扫描的con ...
- 简单谈谈python的反射机制
转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...
- mybatis-自定义typeHandler
场景一:有个java.util.Date在存入数据库的时候自动转换为timestamp时间戳,从数据库取值的时候把时间戳自动转换为java.util.Date 表结构 CREATE TABLE `us ...
- python2.7.5 安装pip
1 先安装setuptools 下载地址:https://pypi.python.org/pypi/setuptools#downloads 将下载后的tar文件解压,用CMD模式进入到解压后的文件所 ...