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虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- 模板类-bitset
stl提供了std::bitset模板类,定义:bitset <32> bitvec;尖括号中的为长度,这条语句把bitvec定义为含有32个的bitset对象.和容器一样,按位置来访问他 ...
- 最新版Sublime Text Build 3156 x64 的下载 + 注册码 + Install Package Control + 汉化教程
一.Sublime Text 下载 神器 Sublime Text 最近开始更新到开发版本 Build 3156,本身英语不是太6,汉化党自然各种百度汉化教程,网上不是一堆绿色汉化包,就是让你下载汉 ...
- struts中用kindeditor实现的图片上传并且显示在页面上
做公司网站的时候由于需要在内容属性中加入图片,所以就有了这个问题,本来一开始找几篇文章看都是讲修改kindeditor/jsp/file_manager_json.jsp和upload_json.js ...
- IntelliJ IDEA 配置 smartGit
教你如何在IntelliJ IDEA中配置smartGit? 一.第一种方式: 1.在启动IDEA工具时,点击下拉按钮"Check out from Version Control" ...
- 部署Asp.net Core 项目发生502.5 或者500 没有其他提示信息
最近将公司原来.NetCore 1.6的项目升级到.net Core 2.0首先发生 502.5的错误,包括IIS日志,Windows应用程序日志都没有记录问题始终解决不了,首先看看官网给出的解决方案 ...
- [国嵌攻略][099][Linux内核配置与编译]
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...
- 那些年~~~我们的C#笔试内测题目
<深入.NET平台和C#编程>内部测试题-笔试试卷 一 选择题 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格 ...
- J.U.C atomic AtomicInteger解析
很多情况下我们只是需要简单的,高效,线程安全的递增递减方法.注意,这里有三个条件:简单,意味着程序员尽可能少的底层或者实现起来比较简单:高效,意味着耗用资源要少,程序处理速度要快: 线程安全也非常重要 ...
- Java compiler level does not match the version of the installed java project facet错误的解决
因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...