1. Java堆中各代分布:

图1:Java堆中各代分布

Young:主要是用来存放新生的对象。

Old:主要存放应用程序中生命周期长的内存对象。

Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

2. JVM 使用的GC算法是什么?

分代收集。

即将内存分为几个区域,将不同生命周期的对象放在不同区域里;

在GC收集的时候,频繁收集生命周期短的区域(Young area);

比较少的收集生命周期比较长的区域(Old area);

基本不收集的永久区(Perm area)。

3. GC 和 Full GC 有什么区别?

GC(或Minor GC):收集 生命周期短的区域(Young area)。

Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old area)对整个堆进行垃圾收集。

他们的收集算法不同,所以使用的时间也不同。 GC 效率也会比较高,我们要尽量减少 Full GC 的次数。 当显示调用System.gc() 时,gc does a full collection(both young generation and tenured generation).

4. Minor GC后,Eden是空的吗?

是的,Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation 中。

5. Garbage collection options(JDK1.4):

图2:GC参数

堆设置

-Xms :初始堆大小

-Xmx :最大堆大小

-XX:NewSize=n :设置年轻代大小

-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

-XX:MaxPermSize=n :设置持久代大小

收集器设置

-XX:+UseSerialGC :设置串行收集器

-XX:+UseParallelGC :设置并行收集器

-XX:+UseParalledlOldGC :设置并行年老代收集器

-XX:+UseConcMarkSweepGC :设置并发收集器

垃圾回收统计信息

-XX:+PrintHeapAtGC GC的heap详情

-XX:+PrintGCDetails  GC详情

-XX:+PrintGCTimeStamps  打印GC时间信息

-XX:+PrintTenuringDistribution    打印年龄信息等

-XX:+HandlePromotionFailure   老年代分配担保(true  or false)

并行收集器设置

-XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。

-XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间

-XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

并发收集器设置

-XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

6. 例子:Heap size 设置

场景:在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令:

java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar

系统输出:

Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space

Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space

Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space

Exception in thread “Image Fetcher 2” java.lang.OutOfMemoryError: Java heap space

调优:将-Xms和-Xmx选项设置为32m,而-Xmn为1/4的-Xmx值。

结果:执行java -jar –Xmn8m –Xms32m -Xmx32m SwingSet2.jar,系统正常运行。

7. JVM  Runtime Data Area(运行时数据区):

图3:JVM运行时数据区(一)

Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。

Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。

Java Stacks:每个JVM线程拥有一个私有的栈。

Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program counter)寄存器。

Native method stacks: 保存native方法进入区域的地址 。

图4:JVM运行时数据区(二)

Heap和Method area被所有线程共享,其生存期和JVM的生存期相同;Java Stacks、Pc registers、Native method stacks被每个线程独自拥有,其生存期和线程的生存期相同。

8. 常见的内存泄露错误

很多开发人员都碰到过java.lang.OutOfMemoryError的错误。这种错误又分两种:java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space。引起这种错误的原因可能是程序问题,也可能是是JVM参数配置问题引起的。若是参数问题,前者可以同过配置-Xms和-Xmx参数来设置,而后者可以通过配置 -XX:PermSize和-XX:MaxPermSize来设置。

9. 参考资料:

1.  A brief history of garbage collection –

2.  Garbage collection in the HotSpot JVM –

3.  Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

4.  Diagnosing a GC problem –

java 虚拟机 新生代与老年代gc_java 虚拟机--新生代与老年代GC相关推荐

  1. java虚拟机堆和栈用途_Jvm虚拟机学习

    一.组成及其作用 1.类加载器 虚拟机把描述类的数据从Class文件加载到内存,并且对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型: 1.1.类加载过程加载:根据查找路径 ...

  2. JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型. 如同一台真实的机器,它有自己的指令集 ...

  3. Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  4. java dump分析工具_Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化...

    大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 通过前面的几篇博客,我 ...

  5. java dump分析工具_Java虚拟机详解(七)------虚拟机监控和分析工具(1)

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  6. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  7. jvm虚拟机_一文入门jvm虚拟机

    点击上方「10分钟编程」关注我呦 让我们每天「博学」一点点 一文带你理解JVM 1.jdk.jre.jvm的区别与联系 jdk的全称是Java Development kit(java开发工具包),我 ...

  8. Java基础之jvm,堆的分类新生代、老生代和永久代详解

    JVM是Java Virtual Machine(Java虚拟机),是一种用于计算设备的规范,一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 引入Java语言虚拟机后,J ...

  9. 虚拟机的特点,什么是虚拟机

    通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.通过虚拟机软件,你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你 ...

最新文章

  1. 如何将Java源代码文件的编码从GBK转为UTF-8?
  2. echart的关系图高亮_echarts鼠标覆盖高亮显示节点及关系名称详解
  3. [树组BIT]训练两题重新理解ver.
  4. es6学习---.babelrc文件
  5. 改:今天看到的一个有趣面试题:return *this和return this有什么区别?
  6. java compareTo() 用法注意点
  7. php点击按钮显示隐藏代码,jQuery中点击按钮实现显示与隐藏的方法
  8. 使用Nexus搭建Maven仓库
  9. 常用圆圈数字序号(1~50)
  10. VGG-16网络结构
  11. 国际网页短信平台通道源码搭建软件后台定制-移讯云短信系统
  12. Nutch第一次搭建部署总结
  13. Rplidar学习(二)—— SDK库文件学习
  14. PHP 每日学习函数之 floatval 函数
  15. 网站建设流程都有哪些?
  16. 【网络】如何判断网络达到瓶颈
  17. android内核函数,Android display架构分析三-Kernel Space Display架构介绍
  18. 8脚51单片机DIY时间显示+闹钟技术分享(一)
  19. prometheus-community-PushProx介绍
  20. Android APP的签名

热门文章

  1. 《现代操作系统》读书笔记之——进程调度(二)
  2. Marshal在C#中的应用(void *指针到IntPtr的转化)
  3. C#中Tuple的使用
  4. 基类指针和子类指针相互赋值
  5. c语言如何监控网卡信息,查看网卡信息及状态和网卡日志信息
  6. 在tomcat上部署项目需要打成jar_Spring Boot Web 项目教程,SpringBoot与传统Web 优缺对比...
  7. 停车场管理系统c语言程序,c语言程序设计 停车场管理系统 停车场有1-20个车位号,设计一个停车场管理系统,实现停车场管理...
  8. 如何证明服从卡方分布_概率论中的谁会证明(n-1)s^2/σ^2服从卡方分布
  9. 如何在vue中使用剪裁图片插件cropperImage
  10. 一些用过的优秀软件摘录