在JVM运行的过程中,为保证其稳定、高效或在出现GC问题时分析问题原因,我们需要对GC进行监控。所谓监控,其实就是分析清楚当前GC的情况。其目的是鉴别JVM是否在高效的进行垃圾回收,以及有没有必要进行调优。通过监控GC,我们可以搞清楚很多问题,如:
- minor GC和major GC的频率;
- 执行一次GC所消耗的时间;
- 新生代的对象何时被移到老生代以及花费了多少时间;
- 每次GC中,其它线程暂停(Stop the world)的时间;
- 每次GC的效果如何,是否不理想;
在JVM运行的过程中,为保证其稳定、高效或在出现GC问题时分析问题原因,我们需要对GC进行监控。所谓监控,其实就是分析清楚当前GC的情况。其目的是鉴别JVM是否在高效的进行垃圾回收,以及有没有必要进行调优。通过监控GC,我们可以搞清楚很多问题,如:
以上所有的知识都是为了这最后一步,调优,但是在调优之前我们要记住以下原则:
1. 多数的Java应用不需要在服务器上进行GC优化;
2. 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
3. 在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
4. 减少创建对象的数量;
5. 减少使用全局变量和大对象;
6. GC优化是到最后不得已才采用的手段;
7. 在实际使用中,分析GC情况优化代码比优化GC参数要多得多;
GC 优化的目的有两个:
GC的时间足够短
GC的次数足够少
说到垃圾回收(Garbage Collection,GC),很多Java程序员认为垃圾回收是JVM的问题,我们不需要去关心垃圾回收的问题,全权都交给了JVM来处理就好了。那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?了解Java的垃圾回收(GC)原理能给我们带来什么好处?我们如何监控GC,我们如何优化GC使其工作的更好?下面我们就逐一探讨一下这些问题,这也是本文的大纲:
JVM默认有好多参数,但是好多都是没有启用的,或者有些是在JVM启动的时候设置了一些默认值,假如我们能指定某些参数的值或者启用某些JVM监控参数的设置,这对我们以后JVM的调优将有很大帮助。
JVM参数大约有三种表示方法:
Java内存分配和回收的机制概括的说就是:分代分配,分代回收。对象根据其存活时间大体分为:新生代、老年代和持(永)久代
对象被创建时,内存的分配首先发生在新生代,除非这个对象太大,或者超过了设置的阈值-XX:PretenureSizeThresold设置的值,则直接被分配到Old区。大部分的对象在创建后很快就不再使用,因此很快变得不可达,于是被年轻代的GC机制清理掉,这个GC机制被称为Minor GC或叫Young GC。注意,Minor GC并不代表新生代内存不足,它事实上只表示在Eden区上的GC。
在Vim中,有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding 和termencoding。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个Vim用户都应该明确这四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。
encoding简写为enc,是Vim内部使用的字符编码方式。通常情况下,enc和locale相同,即enc的默认值是由你的locale来决定的。当我们设置了encoding之后,Vim内部所有的buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。
JDK、JRE和JVM是Java编程语言的核心概念,尽管它们看起来差不多,作为程序员我们可能不怎么关心,但是作为专业的程序员我们必须了解清楚。
JDK是Java的核心组件,并提供编译、调试和运行一个Java程序所需要的所有工具,可执行文件和二进制文件,JDK针对不同的平台有不同的安装包,可以说JDK是JRE的超集,它包含了JRE的Java编译器,调试器和核心类。
Vim基本配置
刚刚安装或者系统默认的Vim是非常丑陋的,如:没有语法高亮、不显示行号……当然了功能也不是很完善,根本不像网上说的那样神奇,这是因为没有对Vim进行一些配置,现在我们就来配置一下,让其发挥神器的功能,编辑vim ~/.vimrc
,如果没有则创建。