- 浏览: 932219 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (423)
- mysql (37)
- hibernate (3)
- struts (9)
- spring (33)
- dom4j (2)
- junit (0)
- exception (1)
- 随笔杂谈 (12)
- google app engine (1)
- XMPP (1)
- OAuth安全授权 (1)
- 版本控制 (8)
- 心情感悟 (0)
- core java (19)
- log4j (7)
- jquery (12)
- javascript (10)
- 网站性能优化及工具 (11)
- 服务器架设配置等 (38)
- EXT (4)
- 正则表达式 (5)
- 日志统计分析 (2)
- htmlparse (4)
- httpclient (5)
- java随笔 (5)
- dhtmlxtree (1)
- freemarke (5)
- memcached (6)
- javamail (5)
- Linux命令 (10)
- 应用监控cpu web jdbc等 (4)
- jmagick (9)
- 第三方缓存策略 (9)
- ORM (2)
- hadoop (2)
- 大数据量处理 (8)
- 经典 (1)
- 权限设计 (1)
- andriod (1)
- mybatis (12)
- redis (24)
- 数据结构_算法 (5)
- 分布式系统 (1)
- php (1)
- 网络编程 (3)
- 服务器部署 (3)
- ios (2)
- IM (23)
- mina (1)
- 视讯和语音 (1)
- 代码生成 (1)
- 架构 (4)
- 建模工具 (1)
- oracle (4)
- solr (10)
- 构建工具 (7)
- html5 (1)
- nginx (5)
- css (1)
- 大数据-分布式 (2)
- 设计模式 (2)
- mq (2)
- jvm调优 (8)
- 并发编程 (2)
- 搜索引擎 (1)
- UML (2)
最新评论
-
天使建站:
jquery获取网页里多选框checkbox选中项的值的方法及 ...
JS jQuery分别获取选中的复选框值 -
abao1:
发现一个小问题 sortAndSave方法中的for循环 第二 ...
完整java实现外部排序 -
西巴拉古呀那:
Kafka分布式消息系统实战(与JavaScalaHadoop ...
消息系统kafka介绍 -
kafodaote:
Kafka分布式消息系统实战(与JavaScalaHadoop ...
消息系统kafka介绍 -
成大大的:
Kafka分布式消息系统实 ...
消息系统kafka介绍
JVM是Java Virtual Machine(Java虚拟机)的缩写,Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。JVM 也有自己的相关规范,使得第三方可以开发出自己的JVM,比如IBMJVM,MSJVM,HOTSPOT JVM(SUN)。本文是参考HOTSPOT JVM进行介绍。
二、JVM内存结构
JVM内存框架图
注: 上图的序号是从左向右进行标记,序号顺序不代表逻辑关系
下面我们将按逻辑关系进行介绍
1 JVM Process Heap
32位OS:最多约2GB
64位OS:更多。
2 Java Object Heap(JAVA Heap)
通常被称为JVM heap ,容易和JVM process Heap混淆,它是用来存储java OBject的如:
Object的实例和Object的基本数据及引用。
-XX:MinHeapFreeRatio=
Default is 40 (40%)
-XX:MaxHeapFreeRatio=
Default 70%
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小 于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。
3、Young Generation
所有新创建的Object 都将会存储在这里。
配置方式 :
-Xmn – not preferred (fixed value)
-XX:NewRatio=<value> - preferred
(dynamic)
官方推荐的配置是新生代(Young Generation)占整个Java Object Heap内存的33%
4、Eden Space
新的Object总是创建在Eden Space。
5、Old Generation
如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。
6、Survivor Spaces
GC时,Eden中活的对象复制到surivivor spaces ,当对象达到最打值(老化)时,被送到Old Generation
10、Tenured Space
5MB min 44MB max (default)
这就是传说中的老年代,官方给的解释就是:
pool containing objects that have existed for some time in the survivor space.
11、Everything else
这其实就是我们常常见到的no-heap
12、Permanent Space
4MB initial , 63MB max
存储class的函数及其他的meta Data.
配置方式:
-XX:PermSize=<value> (initial)
-XX:MaxPermSize=<value> (max)
13、Code Generation
转换byte code 为native code.
基本不会导致内存异常。
如果该操作没有足够的空间,JVM可能会导致崩溃。
14、Socket Buffers
包括两部分:1:Receive buffer ~37k 2:Send buffer ~25k
需要在JAVA代码中来控制他,所以在外部无法配置。
他可能导致的异常:IOException: Too many open files (for
example)
15、Threaded JVM Stacks
jvm stacks:
jvm stack: frame data 、operand stack ...
Thread Stacks:
表示各个Thread所分配的空间。
默认至取决于OS/JVM
线程数增加,Thread Stacks则增大。
配置: –Xss
异常:java.lang.OutOfMemoryError:
unable to create new native thread
如果-Xss配置的太小,会引起
java.lang.StackOverflowError
16、Direct Memory Space
他可以让开发人员映射内存到java Object Heap外。
配置: XX:MaxDirectMemorySize=<value>
17、JNI Code 、
JNI code本身使用的内存非常小。
19、JNI allocate memory
JNI 程序本身也需要分配内存。
18、Garbage Collection
其实GC也是需要内存的,gc线程的消耗以及存放GC所缓存的信息。
这里简单介绍下GC的历史:
GC始于1959 –LISP语言
他的初衷:
1、 自动内存清理
2、 让开发变得简单
3、 让debug更方便
Gc的过程
1、锁(Lock it down)
所有对象在GC时会被锁定,以保证他们不会变化。
2、标记(Mark)
遍历所有对象,标记 不可到达阶段的对象(unreachable)为 垃圾(需要回收)
3、清理(Sweep)
删除所有被标记对象
清理内存
GC在早及的JAVA版本中的问题
1、GC不能很好的协调。
2、只有一个算法。
3、标记(Mark)、清理(Sweep)需要扫描整个Heap,需要花费很久的时间。当然该时间取决与堆的大小。所以人们发明了永久性空间(Permanent Space)
GC工作原理:
Eden——所有新创建的对象都被放置在这里。
Survivor——当Eden区空间不足时,会将其中依旧存活的对象拷贝到两块Survivor区域(FromSpace和 ToSpace)中的一个,如果此时这个Survivor区域也空间不足,则将该块区域中存活的对象拷贝到另一块区域中。 注意,总有一个Survivor区域是空的。
对Young Generation的垃圾回收叫minor GC,通常很多的对象都活不过一次GC。
Old Generation——但一个Survivor区域满了的时候,会将该区域中已经历一定次数GC而依旧存活的对象放到Old Generation中。如果Old Generation也满了,那就要Full GC了。Full GC很耗性能,当Full GC进行时,应用程序会暂停。由于大部分对象都活不过一次GC,所以如果服务器上频繁的发生Full GC,就要关注下是不是出问题了。
三、引起的异常
java.lang.OutOfMemoryError: Java heap space
原因:Heap内存溢出,意味着Young和Old generation的内存不够。
解决:调整java启动参数-Xms -Xmx 来增加Heap内存。
java.lang.OutOfMemoryError: unable to create new native thread
原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。
解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。
java.lang.OutOfMemoryError: PermGen space
原因:Permanent Generation空间不足,不能加载额外的类。
解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。
解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。
在GC花费了大量时间,却仅回收了少量内存时,也会报出OutOfMemoryError ,我只遇到过一两次。当使用-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC收集器时,在上述情况下会报错,在HotSpot GC Turning文档 上有说明:
The parallel(concurrent) collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown.
对这个问题,一是需要进行GC turning,二是需要优化程序逻辑。
java.lang.StackOverflowError
原因:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。
解决:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。
IOException: Too many open files
原因: 这个是由于TCP connections 的buffer 大小不够用了。
java.lang.OutOfMemoryError:Direct buffer memory
解决:调整-XX:MaxDirectMemorySize=<value>
发表评论
-
使用Apache Commons Configuration读取配置信息
2016-11-04 09:53 1225在项目中使用一些比较新的库总会给你带来很多快乐,在这篇文章中 ... -
Java NIO 系列教程
2014-03-05 21:18 2086http://ifeve.com/java-nio-all/ ... -
JSON与JAVA数据的相互转换
2014-01-08 16:42 1109import net.sf.json.JSONArray ... -
Hash算法大全(java实现)
2013-11-01 18:29 6220https://weblogs.java.net/blog ... -
Java获取客户端真实IP地址的两种方法
2013-10-31 16:35 10509http://dpn525.iteye.com/blog/ ... -
告别无止境的增删改查:Java代码生成器
2013-08-08 10:04 1276有感于马上要做个比较大的业务系统,想到那无止境的增删改查、粘 ... -
ClassLoader原理
2013-07-10 12:39 881JVM规范定义了两种类 ... -
java classLoader 体系结构
2013-07-10 11:44 796原文出处:http://blog.chenlb.com/20 ... -
Java NIO 详解
2013-05-15 11:50 1466http://vaporz.blog.51cto.com/3 ... -
POI.HSSF.util.HSSFColor中所有颜色索引
2013-05-06 14:33 3892FileInputStream fileInputStr ... -
JAVA实现实用的ZIP压缩与解压
2013-04-07 22:40 919程序实现了ZIP压缩。共分为2部分 : 压缩(compres ... -
java解析获取Excel中的数据--同时兼容2003及2007
2013-04-02 16:06 6741java解析Excel(兼容2003 ... -
改善异常处理的 6 个技巧
2013-01-28 23:23 1091在软件开发过程中,往往会出现一些不可预知的错误,这些错误有可 ... -
POI API整理
2012-10-31 15:48 1862POI API整理 l 创建一个Exce ... -
POI导出EXCEL经典实现 .
2012-10-30 16:57 1492在web开发中,有一个经典的功能,就是数据的导入导出。特别 ... -
运用El表达式截取字符串/获取list的长度
2012-04-27 16:58 1652头部加入标签库 <%@ taglib prefix=& ... -
关于java 中double型数据的四舍五入与加减乘除
2011-06-09 17:28 2103java中用DecimalFormat df = new D ... -
JAVA方法中的参数用final来修饰的原因
2009-04-27 16:15 5219很多人都说在 JAVA 中用 final 来修饰方 ...
相关推荐
java工程师高级面试之JVM虚拟机底层原理篇:VM种类,内存结构,运行原理,垃圾回收算法,各种垃圾回收器等。
JVM阅读工作正在进行中对于理解JVM的工作原理以及在JVM上构建高性能应用程序而言,必不可少的论文和博客文章列表。 该列表由Reynold Xin( )策划和维护。 如果您认为论文应包含在此列表中,请提交拉取请求。 由于我...
导语想写一篇关于androidGC的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GCALLOC和...
小编给大家推荐腾讯课堂联合图灵学院出的一个 2 分钱课程《JVM虚拟机底层原理分析与性能优化》,看它到底是怎么样来实现我们常说常说的诸如JVM内存结构、内存调优、内存模型、以及理解高并发程序的开发精髓
语言篇 Java 常用的类原理 ArrayList HashMap jvm虚拟机 内存模型 内存回收机制 并发编程 同步机制 violate和synchronize wait和notify 线程池 锁 源码分析concurrent包 ConcurrentHashMap CopyOnWriteArrayList ...
JVM web 基础 [NGINX 简介](./docs/nginx/NGINX 简介.md) 框架 Spring [观察 Spring bean 实例化](./docs/spring/观察 Spring bean 实例化.md) [spring 中的设计模式](./docs/Spring 中的设计模式.md) Spring MVC ...
这篇文章记录在准备Java后端面试复习过程中网上常见的考题,同时也会标明题目出现频率,方便大家参考。有缺少、错误的部分欢迎大家补充纠正。–持续更新 文章目录数据类型Java中的八大类型及其包装类型(占用字节数)...
垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制,下面这篇文章主要介绍了关于Java垃圾回收开销降低的几条建议,需要的...
很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对语言的分析,应用机会不多. 设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. ...