`

JVM之(二)内存模式

    博客分类:
  • JVM
阅读更多

来自:http://www.chinasb.org/archives/2011/09/3775.shtml

一.JVM 体系结构:

JVM内存结构

上图展示了JVM 体系结构!下面我们分别说下他们的作用:

方法区

一个JVM只有一个方法区,是所有线程共享的
存放Class的线性二进制流
类信息,该类型的常量池,字段信息,方法的字节码,操作数栈和该方法的栈帧中的局部变量区的大小,异常表,到类ClassLoader的引用,到Class类的应用
方法区大小不固定,可以动态调整
方法区也可以被GC

一个JVM只有一个堆,所有线程共享
存放所有类实例和数组

PC寄存器

JVM会为每一个创建的线程分配一个PC寄存器
大小为一个字节
内容是下一条将执行指令的地址

java方法栈

线程启动时,JVM会为其分配一个Java栈
JVM对java方法栈只有“压栈”,“出栈”的操作,操作的单位是栈帧
栈帧由三部分组成“局部变量区”,“操作数栈“,“栈帧数据区”

二 JVM内存结构

JVM堆结构

堆分为:新生代:Eden,S0,S1;年老代,其中s0,s1是完全对等的,在GC时数据互相拷贝。

例如:下面的列表中各代的比例。

S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 5.83 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.47 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.47 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.48 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.48 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.50 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.50 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.51 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.51 30.71 34.49 36 4.177 223 308.158 312.335
0.00 0.00 7.51 30.71 34.49 36 4.177 223 308.158 312.335

三 内存分配参数:

内存分配参数表

注意:图上的参数是正确的,但是图中说PermSize最大为64M是不对的。

堆分配

四,JVM 内存参数分析实例

环境:OS:Linux version 2.6.9-79.custome.ELxenU cpu: 4 * Intel(R) Xeon(R) CPU E5410 @ 2.33GHz (双核) memory:4G

1
-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=192m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70

-Xmx2g 最大堆内存2G
-Xms2g 最小内存2G
-Xmn256m 新生代内存256m 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般是固定大小的(例如64m、96m),所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:PermSize=192m 持久代 192m
-Xss256k 指定线程桟大小256K
-XX:LargePageSizeInBytes=128m 指定Java heap的分页页面大小为128M
-server 可以使得新生代采用并行GC,年老代采用串行
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC 指定在Old Generation使用concurrent gc ,启用CMS低停顿垃圾收集器。GC线程和应用线程并行
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70

五. 内存回收

GC:垃圾回收。回收的是堆和方法区的内存。

基本原理:找到不被使用的对象,然后回收内存。使用收集器的方式实现GC。

A)怎么找到?从根集合出发,找出无引用的对象。

根集合对象: 当前运行线程栈上引用的对象,常量及静态变量,传到本地方法且没有被本地方法释放的对象引用。

B)收集器

按回收算法为两种: 引用计数收集器,跟踪收集器。

引用计数采用算法:原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。

跟踪收集器采用算法:复制,标记-清除,标记-压缩。

按分区对待的方式分: 增量收集器(jdk5开始废弃),分代收集器。

增量收集器:就是通过一定的回收算法,把一个长时间的中断,划分为很多个小的中断,通过这种方式减少GC对用户程序的影响。

分代收集:对象存活的时间有长短,基于此将堆分为多个代,不同的代采用不同的GC方式。

按吞吐量和响应时间(暂停时间)分为: 串行收集器,并行收集器,并发收集器。

C)评估垃圾回收策略的两个重要度量

吞吐量:JVM花费在垃圾回收上的时间越长,则吞吐量越低
暂停时间:JVM垃圾回收过程当中有一个暂停期,在暂停期间,应用程序不能运行
串行收集器:单线程(单CPU)进行垃圾回收的工作。
–适用情况:数据量比较小;单处理器下并且对响应时间无要求的应用。
–缺点:只能用于小型应用
并行收集器:多个线程同时进行垃圾回收的工作。
–适用情况:”对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:科学计算。
–缺点:应用响应时间可能较长
并发收集器:传说中的CMS。垃圾回收器的一些工作与应用程序同时进行。
–适用情况:”对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器。

D)GC类型

GC有两种类型:Minor GC(Scavenge GC)和Full GC。

Minor GC:对新生代内存进行GC。

Full GC:对新生代,旧生代,持久代都进行GC。

Full GC可能的原因:

a)老年代或持久代空间满。

b)老年代采用CMS GC,GC日志出现prmotion failed和concurrent mode failure时可能触发。

prmotion failed:Minor GC是,S0(S1)放不下,放入旧生代时,仍然放不下造成的。

concurrent mode failure:CMS GC的过程中,有对象放入旧生代,此时旧生代空间不够。

c)统计得到Minor GC后存活对象放入旧生代的平均大小大于旧生代剩余空间。

d)System.gc(),只是”建议”JVM回收内存,不是强制。

六. 为何内存溢出:

既然都有GC,为什么还有内存被用尽(当然除了突然申请大空间)。这里更想说的是新生代和老年代被耗尽。

这是因为jvm有四种引用类型,不同的引用,GC的条件是不一样的。

A)四种引用

软引用:SoftReference,弱引用:WeakReference ,虚引用:PhantomReference。

软引用:内存不足,或软引用不经常使用时会被回收。适用于做缓存。

弱引用:使用弱引用创建的对象本身没有强引用,GC时一定会被回收。

虚引用:虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

除此之外都是强引用,我们一般创建一个对象时的引用就是强引用。对象被强引用,是不会不垃圾回收的。

B)内存溢出(泄露)

两种理解,

一是需要使用的对象在不断增加,直到需要分配的jvm内存超出了无法满足,于是产生溢出。

二是无用的对象在不断增加,但又无法回收,于是产生泄露。

泄露的对象有两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。这些对象不会被GC所回收,然而它却占用内存。

分享到:
评论

相关推荐

    jvm内存结构-机器指令的执行模式演示demo代码

    jvm内存结构-栈的变化,机器指令的格式/执行模式文章中的demo代码。

    java内存模式

    java内存模式

    深入JVM内核 - 原理、诊断与优化

    介绍常用的JVM参数,包括内存分配、堆栈分配、虚拟机运行模式以及调试跟踪参数。 第四课 GC的算法和种类 引用计数 标记清除 复制算法 标记压缩 可触及性 本章是理论性较强的一章,主要介绍GC的基本算法和思想,本...

    JVM中编译Class、内存回收、多线程原理和使用

    Java程序无须显式分配和回收内存,因此JVM如何进行内存的分配和回收也是要关注的问题。 JVM提供了多线程支持,对于分布式Java应用而言,通常要借助线程来实现高并发,JVM中线程资源如何同步的机制及线程之间交互的...

    解决flex 4.6内存不足myeclipse中无法加载设计模式

    解决flex 4.6内存不足myeclipse中无法加载设计模式 1 解决flexbuilder4无法加载设计模式内存不足的方法为先新建一java工程,再新建flex项目 2(1). 调整FlashBuilder eclipse.ini 编辑 {FlashBuilder 安装路径}/...

    06尚硅谷_JVM.docx

    ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:...

    resin-jvm 调优

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 在充分理解了...

    一次性精通JVM JAVA虚拟机

    为什么要学JVM 1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深...第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间

    钻研JAVA虚拟机 全面掌握JVM JAVA虚拟机深入浅出实战课程 视频附带课程代码

    ├─(1) 0801_【掌握】JVM内存模型.mp4 ├─(2) 0802_【掌握】Java对象访问模式.mp4 ├─(3) 0803_【掌握】JIT即时编译器.mp4 ├─(4) 0804_【掌握】JVM堆内存结构.mp4 ├─(5) 0805_【掌握】新生代内存管理.mp4 ├...

    快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    . EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题...EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    MySQL、JVM、RocketMQ、JUC、设计模式、数据结构与算法学习总结.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    JAVA超全面试突击包-答案讲义

    JVM:包括JVM的内存模型,垃圾回收机制,类加载,JVM调优。 多线程和高并发:包括JAVA的线程模型,同步机制,以及如何编写高并发程序。 设计模式:包括常见的设计模式,如单例模式,工厂模式,观察者模式等,以及...

    java查看sun包源码-monitor:java生产环境内存调优(包括jvm参数类型,JVM的参数类型jinfo&jps(参数和进程查看)j

    -Xmixed:混合模式,JVM 自己决定是否编译成本地代码 示例: java -version(默认是混合模式) Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode) java -Xint -version Java HotSp

    招银网络java科技笔试题-WaytoInterview:JVM和设计模式和算法的快速浏览

    简单的Java虚拟机探索之旅以及内存溢出问题探究 堆内存溢出(不断新建静态对象而不释放其唯一引用) 线程栈溢出(不断新建线程调用死循环方法) 方法栈溢出(调用无返回条件的递归方法) 运行时常量池内存溢出(在 ...

    JAVA中级书籍

    掌握JVM内存分配、JVM垃圾回收;类装载机制; 性能优化; 反射机制;多线程;IO/NIO; 网络编程;常用数据结构和相关算法。 2、对面向对象的软件开发思想有清晰的认识、熟悉掌握常用的设计模式;设计模式;单例模式...

    Singleton(单例模式)

    在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这可以节省一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率...

    论文研究-JavaServlet模式的WebGIS性能优化研究.pdf

    由于服务器端性能的优劣直接影响到客户端用户的使用和体验效果,因此对WebGIS服务器端性能问题进行了深入研究,提出了JVM(Java虚拟机)性能调优、建立并改进缓存服务器、使用tmpfs(一种基于内存的文件系统)存储...

    尚硅谷-拓展:工厂设计模式.pdf

    ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:...

Global site tag (gtag.js) - Google Analytics