java内存模型

sun官方网站:sun java 虚拟机模型

JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Generation. 在New Generation中,有一个叫Eden的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to), 它们用来存放每次垃圾回收后存活下来的对象。在Old Generation中,主要存放应用程序中生命周期长的内存对象,还有个Permanent Generation,主要用来放JVM自己的反射对象,比如类对象和方法对象等。

在New Generation块中,垃圾回收一般用Copying的算法,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个Survivor Space, 当Survivor Space空间满了后, 剩下的live对象就被直接拷贝到Old Generation中去。因此,每次GC后,Eden内存块会被清空。在Old Generation块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少内存要求.
垃圾回收分多级,0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾;1级或以上为部分垃圾回收,只会回收NEW中的垃圾,内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。

1,out of memory 只发生在jvm对old和perm generation 回收后还不能获足够内存的情况.

当一个URL被访问时,内存申请过程如下:
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域
B. 当Eden空间足够时,内存申请结束。否则到下一步
C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”

造成full gc的原因:

new了很多对象,没有即时在主动释放掉->Eden内存不够用->不断把对象往old迁移->old满了->full gc

full gc 如何预防,:

1,使用了缓存

访问有两种,第一种是缓存命中率不高的访问,第二种种是缓存命中率很高的访问.对于第一种情况,就没必要缓存了,缓存反而效果不好,浪费内存,没有提升程序效率还浪费空间,特别是如果这种访问量级别很大的时候还会导致full gc.第二种情况,不得不缓存很多对象,不缓存的话就要调用数据库或者其它是要发生io的,所以这时候要不就是想办法减少缓存对象的大小,例如不缓存没必要缓存的数据,或者合并一些数据减少内存的使用.如果还是不行那就加机器,加内存.

总结:在不影响功能的情况下,缓存对象越小越要,命中率越高越好.低命中率的缓存对象还不如不缓存.

2,没使用缓存的情况,貌似不会出现full gc的情况,除非内存太小,或者设置不对,程序有漏洞.

--来源: http://blog.sina.com.cn/s/blog_4e90b3ba0100m5cb.html

转载于:https://www.cnblogs.com/kabi/p/5171406.html

java内存模型及GC原理相关推荐

  1. Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  2. 【转】Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  3. Java内存模型与GC

    Java内存模型 JVM Spec中的Runtime Data Area分为5个区域:pc register(PC寄存器).java stack(JVM方法栈).native stack(本地方法栈) ...

  4. Java内存模型(JMM的原理和介绍)

    Java内存模型之JMM 文章目录 Java内存模型之JMM 一.首先了解计算机硬件存储体系 二.Java内存模型Java Memory Model(JMM) 1. 什么JMM 2. 原则 3. 能干 ...

  5. 支撑Java内存模型的基础原理 西安尚学堂

    指令重排序 在执行程序时,为了提高性能,编译器和处理器会对指令做重排序.但是,JMM确保在不同的编译器和不同的处理器平台之上,通过插入特定类型的Memory Barrier来禁止特定类型的编译器重排序 ...

  6. jvm对象从新生代到老年代_深入理解jvm内存模型以及gc原理

    整体架构 Jvm = 类加载器 + 执行引擎 + 运行时数据区域 类加载器 ● 作用 类加载器是将编译好的class文件加载到内存中,并进行验证.初始化等步骤,形成能被jvm直接使用的类型. ● 加载 ...

  7. java 内存模型面试_Java面试- JVM 内存模型讲解

    经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发.确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些. JVM 的重要性 ...

  8. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

  9. 述说JAVA内存模型

    JAVA内存模型概念 说到并发问题中的"可见性"就不得不要提及JAVA内存模型这一抽象概念:简单说,JAVA内存模型就是JAVA对编译器和处理器在对程序进行优化的时候做出的一系列的 ...

  10. 全面理解Java内存模型

    Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的. 如 ...

最新文章

  1. 246.三元图的应用与绘图实战
  2. java json数据输出,java服务器端输出JSON格式数据
  3. 超过efficientnet
  4. 洛谷P4382 劈配
  5. SAP 固定资产减值准备配置及期初导入
  6. 【Canal源码分析】Sink及Store工作过程
  7. CF600F:Edge coloring of bipartite graph(二分图、构造)
  8. 1218 溢出设置 overflow
  9. 主机屋linux怎么连,全网最详细的samba文件共享服务!
  10. IPv6的地址表达形式
  11. iReasoning MIB Browser显示中文乱码问题
  12. 裂变海报设计的落地干货,为什么海报在裂变活动中这么重要?
  13. 我的2011,一半是海水,一半是烈焰
  14. oracle中转换函数,Oracle中的转换函数
  15. 山大青岛计算机学院郑雯,山东大学自招700余人过线 面试将刷掉20%考生
  16. <2021SC@SDUSC>博客(5)山东大学软件工程应用与实践JPress代码分析(四)
  17. 随机抽取学号的java程序_学生求大神带,在线等急把四十个人随机分成八个组每组五人,输入...
  18. 学习笔记-webrtc
  19. 站住,Maven依赖的scope作用域,还记得几个?
  20. 操作系统安全-第一章-引言

热门文章

  1. BGP超级失误:Verizon 搞垮 Cloudflare 和 AWS 等巨头,导致“连锁灾难性故障”
  2. 昨晚直播后续,关于职场人的能力
  3. 《算法图解》第八章贪婪算法
  4. 2017《面向对象程序设计》课程作业五
  5. 非旋转Treap及可持久化[Merge,Split]
  6. html模块常用命名总结
  7. disable NSLog
  8. Ant运行build.xml执行服务器scp,异常解决jsch.jar
  9. 大二上学期软件工程概论学习进度表(第十一周)
  10. Brute Force(暴力算法)