- 浏览: 378624 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
真的全站唯一:
描述的能不能准确一点,我也以为bigDecimal性能比dou ...
【性能】Java BigDecimal和double性能比较 -
zhanggang807:
学习到了。。以后会考虑往这方面设计
【java规范】Java spi机制浅谈 -
Xiong506:
xiyuan1025 写道你这是在linux下吗,我在linu ...
[监控]Btrace监控简单笔记 -
Xiong506:
xiyuan1025 写道你这是在linux下吗,我在linu ...
[监控]Btrace监控简单笔记 -
Bll:
找不到实现类
【java规范】Java spi机制浅谈
JVM的相关知识是学习java高级特性必须要去深入学习的。平时也有一些学习和实践,不过总结比较少。
今天有时间总结一下最基础的内存模型和GC策略的知识,在此记录一下。
hotspot jvm内存模型
1.内存模型
hotspot的内存模型很多地方都有类似总结,我也简单总结了一下,大概可以用下图表示:
关于几个分区的描述定义
1.线程栈:线程创建是会为每个线程创建一个线程栈,线程栈里面会为每个方法调用创建一个栈帧。主要用于保存线程的当前运行状态。
2.堆:用于存放运行时中生成的新对像。会划分成新生代和老年代。新生代里面又划分成了eden区、存活1区和存活2区。
3.永久区:方法和常量区,用于存放方法字节码元数据和各种常量。
为什么堆会划分为新生代和老年代?
基本原理:对于大部分应用,常驻对象不多。因为大部分存活寿命不长,新生代和老年代的划分有利于区分对待和缩小垃圾回收范围。(Most allocated objects are not referenced (considered live) for long, that is, they die young. Few references from older to younger objects exist.)
2.内存相关启动参数
参数 | 含义 |
-Xms | 最小堆空间 |
-Xmx | 最大堆空间 |
-Xmn | 新生代空间 |
-Xss | 线程栈空间 |
-XX:PermSize=xxx | 永久代空间 |
-XX:MaxPermSize=xxx | 最大永久代空间 |
-XX:SurviorRatio=xxx |
代表eden:s0的比例 |
-XX:NewRatio=xx | 新生代和旧生代的比例. |
-XX:MaxTenuringThreshold。 | 在新生代最大存活次数 |
hotspot 内存垃圾回收策略总结
1.内存回收策略和常见概念
常见内存回收策略可以从以下几个维度来理解:
1.1 串行&并行
串行:单线程执行内存回收工作。十分简单,无需考虑同步等问题,但耗时较长,不适合多cpu。
并行:多线程并发进行回收工作。适合多CPU,效率高。
1.2 并发& stop the world
stop the world:jvm里的应用线程会挂起,只有垃圾回收线程在工作进行垃圾清理工作。简单,无需考虑回收不干净等问题。
并发:在垃圾回收的同时,应用也在跑。保证应用的响应时间。会存在回收不干净需要二次回收的情况。
1.3 压缩&非压缩©
压缩:在进行垃圾回收后,会通过滑动,把存活对象滑动到连续的空间里,清理碎片,保证剩余的空间是连续的。
非压缩:保留碎片,不进行压缩。
copy:将存活对象移到新空间,老空间全部释放。(需要较大的内存。)
一个垃圾回收算法,可以从上面几个维度来考虑和设计,而最终产生拥有不同特性适合不同场景的垃圾回收器。
2.HotSpot JVM的YGC&FGC
YGC :对新生代堆进行GC。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。
FGC :全堆范围的GC。默认堆空间使用到达80%(可调整)的时候会触发FGC。以我们生产环境为例,一般比较少会触发FGC,有时10天或一周左右会有一次。
3.常见GC算法和jvm参数
3.1.串行垃圾收集器
新生代和老生代因为结构划分不一样,其串行收集器算法也不一样
新生代串行收集器
采用stop the world策略,步骤大概是:先从eden区扫描,把存活的对象拷贝到to区,如果to区放不下的对象直接拷贝到old区。再从from区扫描存活对象,如果对象存活次数超过阀值的就移到老年区,其他的移到to区。做完之后from和to区概念互换(from和to只是运行时的概念,其实就对应存活1区和存活2区)。
图形的表示如下:
回收前:
回收后:
老生代串行收集器
老生代垃圾回收主要分为三个阶段 Mark-sweep-compact
Mark
:识别哪些是存活的
Sweep
: 识别垃圾,并回收
Compact
:滑动活动对象并压缩到连续空间,碎片整理。
串行垃圾回收器在jvm client模式下是默认启动的。参数 -XX:+UseSerialGC 可以设置垃圾回收策略为串行。
3.2并行垃圾回收器
主要以下特点:
充分利用CPU
吞吐量优先
和串行一样,不过是多线程执行,缩短了stop-the-world时间。
-server模式下默认的回收器。参数 -XX:+UseParallelGC 可以设置垃圾回收策略为并行。
3.3并行压缩收集器(Parallel Compacting Collector)
只对老生代适用,新生代仍旧和并行垃圾回收器一样。
其过程大概如下:
标记阶段
,使用多线程对存在引用的对象进行并行标记。
分析阶段
,GC对各个区域进行分析,GC认为,在经过上次GC后,越左边的区域,有引用的对象密度要远远大于右边的区域。所以就从左往右分析,当某个区域的密度达到一个值的时候,就认为这是一个临界区域,所以这个临界区域左边的区域,将不会进行压缩,而右边的区域,则会进行压缩。
压缩阶段
,多各个需要压缩的区域进行并行压缩
参数-XX:+UseParallelOldGC 可以设置老生代垃圾回收策略为并行压缩。
3.4 Concurrent Mark-Sweep (CMS) Collector
主要特点
仍旧是老生代适用。
减少停顿,以响应时间为优先。
只有标记和清除,不会进行会压缩。
初始标记和清除支持和应用程序并发执行,中间还是会有一re-mark需要stop the world。
参数-XX:+UseConcMarkSweepGC 可以设置老生代垃圾回收策略为CMS。
3.5 G1垃圾收集器
是在JDK7里支持的,用于取代CMS。具体具体见:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
总结
本文的内容只是仅限于基础层面的的一些知识总结,更加深入的知识点还需要后续深入学习。
以下提供一些学习参考:
memory management whitepaper :
http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf
JVM option:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
淘宝的blue davy的一个jmm分享: http://blog.bluedavy.com/?p=200
评论
发表评论
-
Xml ResourceBundle简单实现
2012-04-17 21:45 4468ResourceBundle主要是用于和本地语言环境相关的一些 ... -
【maven】多子模块maven模板工程archetype创建过程
2012-04-02 20:55 17662最近项目里需要创建一 ... -
【java基础】如何设计java应用程序的平滑停止
2012-03-05 23:44 11019java应用程序退出的触发机制有: 1.自动结束:应用没有存 ... -
【java并发】juc Executor框架详解
2012-02-26 13:55 12509Executor 框架是 juc 里提供的线程池的实现。 ... -
【java并发】juc高级锁机制探讨
2012-02-23 00:52 8718最近在看一些j ... -
【java并发】基于JUC CAS原理,自己实现简单独占锁
2012-02-14 13:47 7867synchronized的基本原理回 ... -
[NoSQL]MongoDB初体验
2012-01-05 16:06 3969因为未来业务发展的一 ... -
【性能】JDBC PreparedStatement和连接池PreparedStatement Cache学习记录
2011-12-08 17:20 16882之前看JDBC规范的时候对PreparedStatement只 ... -
32位机器下的一个java.lang.OutOfMemoryError错误分析
2011-10-17 11:19 2598昨天在本人windows机器( ... -
[监控]Btrace监控简单笔记
2011-09-09 10:57 5063前阵子看了公司网站的一个cache 命中率统计的btrace监 ... -
DBCP数据源配置项记录
2011-09-01 20:22 3000网站最近发生了数据库连接爆掉的问题。排查了下各个应用存在 ... -
【性能】Java BigDecimal和double性能比较
2011-08-28 20:06 14257我们知道 java 里面有个 BigDecimal ... -
【Spring】IOC容器并发条件下,可能发生死锁
2011-08-28 17:07 69411.背景 上周在生产环境应用启 ... -
JDK7 AIO 初体验
2011-08-17 19:20 2605JDK7 AIO初体验 JDK7已经releas ... -
如果要用java实现算法,一定慎用递归
2011-04-06 20:41 12962现象 : 递归是我们很经典的一种算法实现,可以很好的 ... -
java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
2011-02-28 17:12 46410java日志,需要知道的几件事 如果对于comm ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2010-08-17 17:55 125021.jinfo 描述:输出给定 java ... -
java 浮点数为什么精度会丢失
2010-07-15 22:30 4924由于对float或double 的使用不当,可能会出现精度 ... -
一个枚举类的方法设计
2010-06-21 15:28 1691public enum ActionType { A ... -
java内部字符编码浅析
2010-06-07 21:43 6860java内部字符编码浅析 本周遇到一个 ...
相关推荐
### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成...通过合理的内存分配策略和恰当的 GC 调整,可以显著提高应用程序的性能和稳定性。
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun Hotspot JVM 6的内存管理与GC模型,并介绍如何...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
Java内存模型(JMM)规定了线程对共享变量的可见性和有序性,它通过主内存和工作内存的概念来实现多线程之间的协作。 3. JVM调优:JVM调优通常指对JVM进行配置,优化性能以应对特定的应用需求。常见的调优手段包括...
3. **Java 2 Platform, Standard Edition (J2SE)**:2000年,J2SE发布,引入了更多的JVM优化技术,如JIT编译器的进一步改进和内存管理的优化。 4. **Java 5.0与泛型**:2004年,Java 5.0引入了泛型、枚举、自动装箱...
- `-Xms` 和 `-Xmx`: 分别设置JVM初始堆内存和最大堆内存,确保应用在启动时和运行过程中有足够内存。 - `-Xss`: 指定每个线程的栈大小,影响线程创建和执行效率。 - `-Xmn`: 设置年轻代的大小,对新生代GC有直接...
通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...
HotSpot JVM的实现采用了Train GC算法,通过对象分组和分层,优先回收最老且访问频率较低的对象。 【finalize方法】 `finalize`是Java中Object类的一个受保护的方法,用于在对象被回收前执行一些清理工作。开发者...
本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...
总的来说,JVM作为Java语言的核心组成部分,其历史发展、运行时数据区域的管理以及内存回收机制是理解和优化Java应用程序性能的关键。理解这些知识点,有助于开发者编写出更高效、更稳定的代码。
Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...
HotSpot虚拟机中的垃圾回收机制(GC)是JVM内存管理的核心部分。它包括多种策略,其中最常见的是Young Generation Collection(YGC,又称Minor GC)和Full GC(FGC)。YGC负责回收新生代内存中的对象,而FGC则会回收...
【HotSpot GC官网文档...这个文档集合对于深入理解Java垃圾收集机制,特别是HotSpot JVM中的GC工作原理和调优实践具有很高的参考价值。通过这些截图,开发者可以获得关于如何选择、配置和优化垃圾收集器的宝贵信息。
### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...
此外,GC的策略和算法也是重要知识点,包括复制算法、标记-清除算法、标记-整理算法和分代收集等。这些算法各有优缺点,适用于不同场景。例如,年轻代通常使用复制算法,而老年代可能采用标记-整理算法。 总之,这...
在JVM中,垃圾收集(GC)是自动管理内存的重要机制之一。本文将基于给定的资料,详细介绍JVM中的垃圾收集机制及其调优方法。 #### 垃圾收集(GC)概述 垃圾收集(Garbage Collection, GC)是JVM用于自动回收不再...
Java虚拟机(JVM)内存管理和...总结来说,JVM内存管理和垃圾回收是一个复杂而精细的过程,涉及多种策略和算法,旨在高效利用内存,减少应用暂停时间,并防止内存泄漏。理解和掌握这些原理对优化Java应用性能至关重要。
Java虚拟机(JVM)是Java程序运行的基础,它的体系结构和垃圾收集(GC)调优对于优化Java应用性能至关重要。本PPT深入探讨了这两个关键主题,旨在帮助开发者理解和提升应用程序的运行效率。 首先,JVM是一个抽象的...