前言java
以前的文章尤为是讲解GC的时候提到了不少的概念,好比内存溢出和内存泄露、并行与并发、Client模式和Server模式、Minor GC和Full GC,本文详细讲解下这些概念的区别。编程
内存溢出和内存泄露的区别服务器
一、内存溢出并发
内存溢出指的是程序在申请内存的时候,没有足够大的空间能够分配了。jvm
二、内存泄露编辑器
内存泄露指的是程序在申请内存以后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无用。内存泄露通常都是由于内存中有一块很大的对象,可是没法释放。工具
从定义上能够看出,内存泄露终将致使内存溢出。性能
注意,定位虚拟机问题内存问题的时候第一步就是要判断究竟是内存溢出仍是内存泄露,前者好判断,跟踪堆栈信息就能够了;后者比较复杂一点,通常都是老年代中的大对象没释放掉,要经过各类办法找出老年代中的大对象没有被释放的缘由。优化
并行和并发的区别spa
这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,能够这么理解这两个名词:
一、并行Parallel
多条垃圾收集线程并行工做,但此时用户线程仍然处于等待状态
二、并发Concurrent
指用户线程与垃圾收集线程同时执行(但并不必定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另外一个CPU上
Minor GC和Full GC的区别
一、新生代GC(Minor GC)
指发生在新生代的垃圾收集动做,由于大多数Java对象存活率都不高,因此Minor GC很是频繁,通常回收速度也比较快
二、老年代GC(Major GC/Full GC)
指发生在老年代的垃圾收集动做,出现了Major GC,常常会伴随至少一次的Minor GC(但并非绝对的)。Major GC的速度通常要比Minor GC慢上10倍以上
Client模式和Server模式的区别
部分商用虚拟机中,Java程序最初是经过解释器对.class文件进行解释执行的,当虚拟机发现某个方法或代码块运行地特别频繁的时候,就会把这些代码认定为热点代码Hot Spot Code(这也是咱们使用的虚拟机HotSpot名称的由来)。为了提升热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各类层次的优化,完成这个任务的编译器叫作即时编译器(Just In Time Compiler,即JIT编译器)。JIT编译器并非虚拟机必需的部分,Java虚拟机规范并无要求要有JIT编译器的存在,更没有限定或指导JIT编译器应该如何去实现。可是,JIT编译器性能的好坏、代码优化程度的高低倒是衡量一款商用虚拟机优秀与否的最关键指标之一。
解释器和编译器其实和编译器各有优点:
一、当程序须要迅速启动和执行的时候,解释器能够先发挥做用,省去编译的时间,当即执行
二、在程序运行后,随着时间的推移,编译器逐渐发挥做用,把愈来愈多的代码编译成本地代码以后,能够获取更高的执行效率
咱们使用的HotSpot中内置了两个JIT编译器,即C1编译器和C2编译器,默认采用的是解释器和一个编辑器配合的方式进行工做。HotSpot在启动的时候会根据自身版本以及宿主机器的硬件性能自动选择运行模式,好比会检测宿主机器是否为服务器、好比J2SE会检测主机是否有至少2个CPU和至少2GB的内存。
一、若是是,则虚拟机会以Server模式运行,该模式与C2编译器共同运行,更注重编译的质量,启动速度慢,可是运行效率高,适合用在服务器环境下,针对生产环境进行了优化
二、若是不是,则虚拟机会以Client模式运行,该模式与C1编译器共同运行,更注重编译的速度,启动速度快,更适合用在客户端的版本下,针对GUI进行了优化
有两种方法查看虚拟机是运行在Client模式下仍是Server模式下:
一、在程序命令行运行“java -version”命令,查看的是你本地安装的虚拟机是信息
二、好比咱们用Eclipse或者MyEclipse运行程序,通常使用的都是工具自带的JRE,虚拟机并非本地安装的虚拟机。这时候怎么办呢,能够经过在程序中运行下面的语句来查看虚拟机信息
System.out.println(System.getProperty("java.vm.name"));
我这里的运行结果是
Java HotSpot(TM) 64-Bit Server VM
固然要改变虚拟机运行的模式也能够,只须要改jvm.cfg就能够了。咱们能够从如下几个地方找到jvm.cfg:
一、32位的JDK的文件路径是 JAVA_HOME/jre/lib/i386/jvm.cfg
二、64位的JDK的文件路径是 JAVA_HOME/jre/lib/amd64/jvm.cfg
三、MyEclipse在 .../Common/binary/com.sun.java.jdk.win32.x86_64_1.6.0.013/jre/lib/amd64/jvm.cfg
目前64位只支持Server模式,文件内容都是同样的,上面的注释不去管它,剩下的就是这些:
-server KNOWN -client IGNORE -hotspot ALIASED_TO -server -classic WARN -native ERROR -green ERROR
因为个人电脑装的是64位JDK,因此是“-client INGORE”。同时支持Server模式和Client模式的,应该是“-server KNOWN”和“-client KNOWN”,通常只须要变动这两个配置的前后顺序便可,可是前提是JAVA_HOME/jre/bin目录下同时存在server和client两个文件夹,分别对应着各自的虚拟机,缺乏一个,切换后就会报错。