关闭

Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

标签: GCjava内存JVM内存溢出
295人阅读 评论(0) 收藏 举报
分类:

前言

之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露、并行与并发、Client模式和Server模式、Minor GC和Full GC,本文详细讲解下这些概念的区别。

 

内存溢出和内存泄露的区别

1、内存溢出

内存溢出指的是程序在申请内存的时候,没有足够大的空间可以分配了。

2、内存泄露

内存泄露指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无用。内存泄露一般都是因为内存中有一块很大的对象,但是无法释放。

从定义上可以看出,内存泄露终将导致内存溢出。

注意,定位虚拟机问题内存问题的时候第一步就是要判断到底是内存溢出还是内存泄露,前者好判断,跟踪堆栈信息就可以了;后者比较复杂一点,一般都是老年代中的大对象没释放掉,要通过各种办法找出老年代中的大对象没有被释放的原因。

 

并行和并发的区别

这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,可以这么理解这两个名词:

1、并行Parallel

多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态

2、并发Concurrent

指用户线程与垃圾收集线程同时执行(但并不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上

 

Minor GC和Full GC的区别

1、新生代GC(Minor GC)

指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快

2、老年代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编译器性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键指标之一。

解释器和编译器其实和编译器各有优势:

1、当程序需要迅速启动和执行的时候,解释器可以先发挥作用,省去编译的时间,立即执行

2、在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率

我们使用的HotSpot中内置了两个JIT编译器,即C1编译器和C2编译器,默认采用的是解释器和一个编辑器配合的方式进行工作。HotSpot在启动的时候会根据自身版本以及宿主机器的硬件性能自动选择运行模式,比如会检测宿主机器是否为服务器、比如J2SE会检测主机是否有至少2个CPU和至少2GB的内存。

1、如果是,则虚拟机会以Server模式运行,该模式与C2编译器共同运行,更注重编译的质量,启动速度慢,但是运行效率高,适合用在服务器环境下,针对生产环境进行了优化

2、如果不是,则虚拟机会以Client模式运行,该模式与C1编译器共同运行,更注重编译的速度,启动速度快,更适合用在客户端的版本下,针对GUI进行了优化

有两种方法查看虚拟机是运行在Client模式下还是Server模式下:

1、在程序命令行运行“java -version”命令,查看的是你本地安装的虚拟机是信息

2、比如我们用Eclipse或者MyEclipse运行程序,一般使用的都是工具自带的JRE,虚拟机并不是本地安装的虚拟机。这时候怎么办呢,可以通过在程序中运行下面的语句来查看虚拟机信息

System.out.println(System.getProperty("java.vm.name"));

我这里的运行结果是

Java HotSpot(TM) 64-Bit Server VM

当然要改变虚拟机运行的模式也可以,只需要改jvm.cfg就可以了。我们可以从以下几个地方找到jvm.cfg:

1、32位的JDK的文件路径是  JAVA_HOME/jre/lib/i386/jvm.cfg

2、64位的JDK的文件路径是  JAVA_HOME/jre/lib/amd64/jvm.cfg

3、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两个文件夹,分别对应着各自的虚拟机,缺少一个,切换后就会报错。

0
0
查看评论

8.《深入理解Java虚拟机》内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

内存溢出和内存泄露的区别 内存溢出:指的是程序在申请内存的时候,没有足够大的空间可以分配了。 内存泄露:指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无用。内存泄露一般都是因为内存中有一块很大的对象,但是无法释放。 从定义上可以看出,内存泄露终将导致内...
  • u010853261
  • u010853261
  • 2017-01-02 13:46
  • 557

内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露、并行与并发、Client模式和Server模式、Minor GC和Full GC,本文详细讲解下这些概念的区别。 内存溢出和内存泄露的区别 1、内存溢出 内存溢出指的是程序在申请内存的时候,没有足够大的空间可以...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016-04-21 09:58
  • 1551

Minor GC和Full GC区别

概念:  新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具 备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。  老年代 GC(Major GC  / Full GC):指发生在老年代的 ...
  • u010796790
  • u010796790
  • 2016-08-15 18:48
  • 2502

Java GC工作原理以及Minor GC、Major GC、Full GC简单总结

名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。 Major GC/Full GC:老年代GC,指发生在老年代的GC。 JVM:Ja...
  • u012500848
  • u012500848
  • 2016-05-09 19:22
  • 8065

Minor GC、Major GC和Full GC之间的区别-JVM

JVM 内置的通用垃圾回收原则。堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,代假设和其他不同的 GC 算法超出了本文讨论的范围。 Minor GC 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。这一定义既清晰又易于...
  • ShareUs
  • ShareUs
  • 2016-05-20 23:47
  • 5030

深入理解GC ——MinorGC\MajorGC\FullGC(辟谣)

这篇文章之前就发了,但是如今看来有很多含糊不清的解释,非常不严谨。这次修改了,宁可不发,也不能发误导性文章!另外这件事再一次提醒我,中文技术博客存在大量误导性内容,查阅官网文章才是 严谨之道! HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old ge...
  • lemon89
  • lemon89
  • 2015-05-03 22:10
  • 8126

Minor GC和FUllGC的区别

在Plumbr的工作过程中遇到GC间隙功能探测问题使我不得不关注相关文章,书籍,简报。自始至终,我不止一次迷惑于 Minor, Major and Full GC 的用法。为了搞清楚这些疑惑我写这篇博客。 这篇博客期望读者了解JVM 底层 GC机制。jvm heap区 分为 Eden,Surv...
  • yinbucheng
  • yinbucheng
  • 2017-05-30 15:42
  • 500

java虚拟机--jvm client模式与server模式的区别

JVM client模式和Server模式 JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。JVM如果不显式指定是-Server模式还是-client模式, JVM工作在Server模式可以大大提...
  • u014236541
  • u014236541
  • 2015-11-22 22:04
  • 2066

Minor GC、Major GC和Full GC之间的区别及JVM内存分布,JVM垃圾回收初解-JVM

JVM 内置的通用垃圾回收原则。堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,代假设和其他不同的 GC 算法超出了本文讨论的范围。 Minor GC 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。...
  • u014490157
  • u014490157
  • 2016-09-22 20:26
  • 1076

Major GC和Full GC的区别是什么?触发条件呢?

作者:RednaxelaFX 链接:http://www.zhihu.com/question/41922036/answer/93079526 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对HotSpot VM的实现,它里面的GC其实准确分类只有...
  • z69183787
  • z69183787
  • 2016-06-07 20:26
  • 5181
    个人资料
    • 访问:46652次
    • 积分:834
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:112篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论