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虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- [bzoj2462] [BeiJing2011]矩阵模板
二维的hash.. 注意n的范围是1000........ 真相似乎是全部输出1就行了233 #include<cstdio> #include<iostream> #incl ...
- BZOJ2726: [SDOI2012]任务安排
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2726 倒着做,前面的点对后面的点都是有贡献的. f[i]=min(f[j]+cost[i]*( ...
- hdu_1027(好吧。。。牛。。。next_permutation也可以水过)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; int ...
- 找出单链表中倒数第K个元素
- ubantu下su命令Authentication failure失败的解决方式
Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root . 可以使用: sudo passwd 来重新设置root密码,后即可登陆root. ortonwu@ubu ...
- jq.paginator分页插件稍加修改
样式一: 样式二: 此分页功能在jq.paginator分页插件上稍加修改. 必加模板html: <div id="jqPaginator"> <div id=& ...
- JXLS 2.4.0系列教程(四)——多sheet是怎么做到的
注:本文代码在第一篇文章基础上修改而成,请务必先阅读第一篇文章. http://www.cnblogs.com/foxlee1024/p/7616987.html 本文也不会过多的讲解模板中遍历表达式 ...
- Linux中安装opencv-3.3.1
在ubuntu16.04中安装opencv3.3.1的过程中踩了许多坑.一开始直接安装还挺顺利但运行程序时总是提示libgtk2.0-dev和pkg-config没有安装,在安装这两个包的过程中也不顺 ...
- SpringBoot介绍及环境搭建
什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...
- kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition...Error: NETWORK_EXCEPTION
kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition... ...