JVM内存机制资料笔记(转)

JVM内存机制资料笔记

参考
JDK5.0垃圾收集优化之--Don't Pause
http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspx
JVM内存模型以及垃圾回收
http://hi.baidu.com/xuwanbest/blog/item/0587d82f2c44a73d1e30892e.html
对jvm内存的一些理解
http://www.blogjava.net/midstr/archive/2008/09/21/230292.html
了解JVM的内存管理与垃圾回收
http://hi.baidu.com/jiaozhenqing/blog/item/f18b85d4c1063a07a08bb77e.html

Java内存溢出的解决方案

http://hi.baidu.com/yanghlcn/blog/item/029e7303917b528dd43f7cc3.html

Java内存组成

 

 

堆(Heap)
    运行时数据区域,所有类实例和数组的内存均从此处分配。Java 虚拟机启动时创建。对象的堆内存由称为垃圾回收器 的自动内存管理系统回收。
    组成
        News GenerationYoung Generation即图中的Eden + From Space + To Space)
            Eden 存放新生的对象
            Survivor Space 两个 存放每次垃圾回收后存活的对象
        Old GenerationTenured Generation 即图中的Old Space) 主要存放应用程序中生命周期长的存活对象
非堆内存
    JVM具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机启动时创建的。
    除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。 例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。

    组成
        Permanent Generation   (图中的Permanent Space) 存放JVM自己的反射对象,比如类对象和方法对象
        native heap

GC策略


      JVM采用一种分代回收 (generational collection) 的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍。

      当一个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错误”

   
对象衰老的过程
    young generation的内存,由一块Eden(伊甸园,有意思)和两块Survivor Space(1.4文档中称为semi-space)构成。新创建的对象的内存都分配自eden。两块Survivor Space总有会一块是空闲的,用作copying collection的目标空间。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。所谓survivor,也就是大部分对象在伊甸园出生后,根本活不过一次GC。对象在young generation里经历了一定次数的minor collection后,年纪大了,就会被移到old generation中,称为tenuring。(是否仅当survivor space不足的时候才会将老对象tenuring? 目前资料中没有找到描述)
     剩余内存空间不足会触发GC,如eden空间不够了就要进行minor collection,old generation空间不够要进行major collection,permanent generation空间不足会引发full GC。

 

非堆内存

      GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误。

 

 

JVM的默认设置

(heap)(News Generation 和Old Generaion 之和)的设置

       初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G。

       最大分配的内存由-Xmx指定,默认是物理内存的1/4但小于1G。

       默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。
默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。

服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小,所以上面的两个参数没啥用。 

       -Xmn 设置young generation的heap大小

      -XX:MinHeapFreeRatio与-XX:MaxHeapFreeRatio设定空闲内存占总内存的比例范围,这两个参数会影响GC的频率和单次GC的耗时。-XX:NewRatio决定young与old generation的比例。Young generation空间越大,minor collection频率越低,但是old generation空间小了,又可能导致major collection频率增加。-XX:NewSize和-XX:MaxNewSize直接指定了young generation的缺省大小和最大大小。

 

非堆内存 的设置

     默认分配为64M

     -XX:PermSize设置最小分配空间,-XX:MaxPermSize设置最大分配空间。一般把这两个数值设为相同,以减少申请内存空间的时间。

 

 

内存溢出 的原

Old Generation溢出
这种内存溢出是最常见的情况之一,产生的原因可能是:
1) 设置的内存参数过小(ms/mx, NewSize/MaxNewSize)

    解决方法:

     1G内存环境下java jvm 的参数设置参考:

    -server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m  -Djava.awt.headless=true


2) 程序问题
单个程序持续进行消耗内存的处理,如循环几千次的字符串处理,对字符串处理应建议使用StringBuffer。此时不会报内存溢出错,却会使系统持续垃圾收集,无法处理其它请求,相关问题程序可通过Thread Dump获取。

单个程序所申请内存过大,有的程序会申请几十乃至几百兆内存,此时JVM也会因无法申请到资源而出现内存溢出,对此首先要找到相关功能,然后交予程序员修改,要找到相关程序,必须在Apache日志中寻找。
当Java对象使用完毕后,其所引用的对象却没有销毁,使得JVM认为他还是活跃的对象而不进行回收,这样累计占用了大量内存而无法释放。由于目前市面上还没有对系统影响小的内存分析工具,故此时只能和程序员一起定位。

 

 

Permanent Generation 溢出
通常由于 Perm 段装载了大量的类而导致溢出,如
spring的动态生成类。

目前的解决办法:
1) 将 Perm Size扩大,一般256M能够满足要求
2) 若别无选择,则只能将servlet的路径加到CLASSPATH中,但一般不建议这么处理

C Heap溢出
系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存

一些文章:

http://java.sys-con.com/node/1229281

 

JVM内存分配担保机制 目录 担保机制 案例1:新生代无法分配内存,晋升到老年代,且担保成功 结果1:使用Serial收集器 结果2:使用ParallelScavenge收集器 案例2:Parallel Scavenge晋升条件:当需要分配的内存小于等于Eden区内存的一半,就有可能让Eden区现有的对象晋升到老年代 结果 FullGC(Ergonomics) Parallel Scavenge的执行入口 Ergonomics的值 再看【need_full_gc】的值 进入【should_full... 阅读详情

相关推荐

JVM内存模型、GC机制及原理详解

Java虚拟机(JVM)内存模型是Java程序运行时的核心架构,它定义了程序运行时数据的存储和管理方式。JVM内存主要分为以下几个区域:垃圾对象判定算法:JVM内存模型和GC机制是Java高效运行的基础。理解这些原理有助于:随着Java发展,GC技术也在不断进步,从早期的Serial收集器到现在的ZGC、Shenandoah等低延迟收集器,开发者有了更多选择来满足不同应用场景的需求。

lssffy的博客 1298

JVM内存机制资料笔记

JVM内存机制资料笔记 参考 JDK5.0垃圾收集优化之--Don't Pause http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspx JVM内存模型以及垃圾回收 http://hi.baidu.com/xuwanbest/blog/item/0587d82f2c44a73d1e30892e.html 对jvm内存的一些理...

寻常茶饭寻常人 259

步科触摸屏编程

1.首先官网上下载kinco软件,然后再安装驱动,安装的方式是需要两个文件。把两个文件放到driver文件夹下面,然后设备管理器右键更新,手选driver文件夹,自动安装即可。 步科触摸屏驱动文件下载地址 2.按照步科触摸屏使用手册一步一步来建立工程 Kinco HMIware使用手册下载地址 登录界面 涉及到的是页面切换,用的是login window,然后只留下等级输入那个

MAYBE的博客 2万+

JVM调优实战

JVM调优实战1、JVM基础参数配置2、JVM常用命令3、调优工具 1、JVM基础参数配置 -Xmx 最大堆内存 -Xms 最小堆内存 一般来说,在项目正式上线的时候,最大堆内存和最小堆内存需要设置成一样大小,防止JVM自动对内存自动扩展。因为JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服

m0_38018775的博客 426

详细了解JVM运行时内存

这表示Eden占整个新生代的8/10,而两个survivor区域分别占了1/10,另外,需要补充一点,由于JVM在运行时,每次都只会使用Eden区和一块survivor区进行服务,因此总是会有一个survivor区域是空闲着的,所以新生代的最高使用也只能达到9/10。这里可以看出打印出来的Xmx值18m和设置的值20m之间是有差异的,total Memory和最大的内存之间也还是存在比较明显的差异,就是说JVM一般会尽量保持内存在一个尽可能底的层面,而非贪婪做法按照最大的内存来进行分配。

Huangjiazhen711的博客 798

Java 内存分配及容量扩充

一、Java 进程的内存使用 当运行一个Java应用程序时,Java 运行时会创建一个操作系统进程,作为操作系统进程,Java 运行时面临着与其他进程完全相同的内存限制 架构提供的内存寻址能力依赖于处理器的位数,举例来说,32位或者64位进程能够处理的位数决定了处理器能寻址的内存范围:32位提供了 2^32 的可寻址范围,也就是 4,294,967,296 位,或者说 4GB。而 64 位处理

忧郁王子的专栏 1万+

jvm-03运行时数据区(堆)

堆 1.核心概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。 一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的) 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的 所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:T

lxsxkf的博客 478

JVM 学习笔记(一)内存结构

一、前言 1、什么是 JVM ? 1)定义 Java Virtual Machine ,Java 程序的运行环境(Java 二进制字节码的运行环境)。 2)好处 一次编译,处处执行 自动的内存管理,垃圾回收机制 数组下标越界检查 3)比较 JVM、JRE、JDK 的关系如下图所示 2、学习 JVM 有什么用? 面试必备 中高级程序员必备 想走的长远,就需要懂原理,比如:自动装箱、自动拆箱是怎么实现的,反射是怎么实现的,垃圾回收机制是怎么回事等待,JVM 是必须掌握的。 3、常见的 JVM 我们主

雾里 4万+

JVM内存划分、JVM内存分配机制JVM垃圾回收机制

--------------------------------------------------- JVM内存管理分为两部分: 内存分配 内存回收 ------------------------------------------------------ 内存回收经常也被叫做垃圾回收。(附带资料JVM面试题超链接、JVM性能调优和 参数说明) *很多人迷惑一个问题,既然J...

此处省略三千字 1万+

JVM】——JVM运行机制、类加载机制内存划分

JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型

阿华的博客 1280

JVM内存机制

JVM内存机制资料笔记 参考 JDK5.0垃圾收集优化之--Don't Pause http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspx JVM内存模型以及垃圾回收 http://hi.baidu.com/xuwanbest/blog/item/0587d82f2c44a73d1e30892e.html 对jv

Cross 1976

彻底搞懂jvm内存以及jvm垃圾回收机制

jvm内存分为线程私有、线程共享、直接内存程序计数器,虚拟机栈,本地方法栈堆,方法区每条线程都要有一个独立的程序计数器,cpu通过这个来决定执行的线程,根据这个取指之前上java棵老师提过一嘴,java的方法是放在栈里面的,这里的栈就是指虚拟机栈,该有就是存放局部变量等等用来放一些naive方法,这些方法通常是用c或c++写的,因为有时候java方法效率太低了,就看做特殊的虚拟机栈来处理。

wdghcfrg的博客 1648

JVM内存管理机制

如果一个类加载器收到了类加载委托,它并不会自己去加载,而是把这个给父类加载器去执行,如果父类加载器还存在父类加载器,则继续向上委托,依次递归,请求最终被委派到启动类加载器,如果父类加载器可以完成委托,则成功返回,如果不能完成委托,则子类加载器才会尝试自己去加载。程序运行时,随着对象数量的增加,JVM内存区使用率也在增加,如果使用率达到100%,程序将无法继续执行,必须进行垃圾回收,为了提高垃圾回收效率,JVM内存进行区域进行划分。为什么要进行垃圾回收:如果只创建,不回收,会造成堆内存溢出(OOM)异常。

weixin_69256055的博客 921

jvm知识梳理

1.java虚拟机的组成 java虚拟机主要由四部分组成 (1)ClassLoader:按特定格式加载class文件到内存中 (2)runtime data area:jvm内存空间模型 (3)execution engine:命令解析器 (4)native interface:融合不同开发语言的原生库供java使用 ...

w6869012的博客 1086

JVM逃逸分析

JVM逃逸分析

weixin_71583566的博客 388

JVM内存结构详解

1、JVM内存结构 程序计数器(Program Counter Register) 虚拟机栈(Java Virtual Machine Stacks) 本地方法栈(Native Method Stacks) 堆(Java Heap) 年轻代区域:堆的年轻代区域用于存放新生对象 Eden From To 元空间(Metaspace) [外链图片存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPBtOLgc-1603510387859)(E:\D

codeLife 308

java 内存异常上升_JVM堆外内存异常增长的解决过程

其实有了MAT这类工具,一般堆内内存基本都能借助工具分析出大概问题所在,但堆外内存有时就不能直观地发现问题了,从解决过几次线上问题的现象总结,堆外内存过高80%都是这两种因素引起:若metaspace正常,有可能是线程数过多造成的若metaspace异常,有可能是classLoader过多造成的当然了,并不是说只有这两种情况,有些也可能是直接内存泄露的问题,但如果你的项目不是大量操作直接内存,或者...

weixin_29774037的博客 3259

一份关于jvm内存调优及原理的学习笔记

JVM 一.虚拟机的基本结构 1.jvm整体架构 类加载子系统:负责从文件系统或者网络中加载class信息,存入方法区中。 方法区(Perm):存放加载后的class信息,包括静态方法,jdk1.6以前包含了常量池。 参数:-XX:PermSize初始值 -XX:MaxPermSize最大值 Java堆(Heap):java工程的主要内存工作区域,所有线...

weixin_33889665的博客 238

JVM内存分配规则

JDK8 默认的,新生代(Young)与老年代的比例值为 1:2(该值可以通过参数 -XX:NewRatio来指定)。新生代分为 Eden和两个Survior区域,分别被命名为from和to,以示区分。默认的,Eden:from:to = 8:1:1(可以通过参数-XX:SurvivorRatio来设定)。JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;

web18334137065的博客 1588

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2829

Ansys Fluent Tutorial Guide 2022 R1官方示例(全套官方案例).zip

Ansys Fluent Tutorial Guide 2022 R1官方示例(全套官方案例):包括FLUENT模块所有官方案例三维示例网格文件(31个),还包括帮助文档PDF文件Ansys_Fluent_Tutorial_Guide_2022_R1.pdf,学习FLUENT各个官方案例的仿真步骤设置过程,依照各个官方案例的网格模型(.msh文件)、帮助文档(PDF文档)。很好的ANSYS Fluent练习资源。供各位仿真工程师和仿真研究分析人员参考、学习。

上一篇: tomcat服务器配置远程调试小记(转)
下一篇: RCP中的几种选择监听(Selection Provider-Listener)机制
esteem
博客等级 码龄22年 3粉丝 56原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值