- 浏览: 90506 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hairongtian:
我想问一下在GC中的gc roots是什么?教科书的看不懂,能 ...
JVM-GC实践总结(纠正并发线程数 转载)
一、JVM简介
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>
发表评论
-
JVM 运行时数据区(转)
2012-07-11 23:02 1058运行时数据区 java虚拟机定义了若干种程序运行时使用 ... -
图解JVM 内存分配
2012-07-10 23:57 12221.简介 现摘录一段Java5 ... -
JVM-GC实践总结(纠正并发线程数 转载)
2012-07-10 16:27 3547首先感谢阿宝同学的帮 ... -
深入Java虚拟机:JVM中的Stack和Heap
2012-07-10 14:26 1093在JVM中,内存分为两个部分,Stack(栈)和He ... -
JVM分代垃圾回收策略的基础概念
2012-07-10 13:50 1358由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中 ... -
Java虚拟机(JVM)中的内存设置详解(转载)
2012-07-09 17:13 1136在一些规模稍大的应用 ... -
JVM参数调优的八条经验(转载)
2012-07-09 14:35 955要想配置好JVM参数,需要对年轻代、年老代、救助空间和永久代有 ... -
Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)
2012-06-30 11:45 1231使用Tomcat的童鞋们注意了。为了增加tomcat的性能和稳 ... -
Tomcat和Terracotta服务器将普通的Web应用部署到集群中,实现跨Tomcat节点的session复 制
2012-06-30 11:31 1353本文介绍如何配置Tomcat和Terracotta服务器将普通 ... -
tomcat session 持久化会话
2012-06-30 11:29 1602tomcat6 中关闭服务 会自动把session持久化 ... -
Tomcat集群Session丢失解决方案
2012-06-29 01:38 4406这几天单服务器整合项目很正常,集群的时候问题就来了,配 ... -
nginx+tomcat集群+session复制
2012-06-29 01:34 1239ulimit -SHn 65535 echo " ... -
linux下的并发数量
2012-06-26 21:32 967在部署系统后,为了增加系统并发量,系统响应速度,做了一些 ... -
网站的静态化处理
2012-06-26 21:10 873urlrewritefilter 下载: htt ... -
linux+nginx+tomcat负载均衡,实现session同步
2012-06-21 15:18 3898花了一个上午的时间研究nginx+tomcat的负载均衡测试, ... -
tomcat6_apache2.2_ajp负载均衡加集群实战 [转]
2012-04-26 16:07 936秀脱linux笔记之tomcat6_apa ... -
JVM内存最大能调多大分析-转帖
2012-02-18 12:48 1389JVM内存最大能调多大分析【经典】 上次用webl ... -
nginx for windows之负载均衡
2011-05-06 17:53 9641.编辑c:\nginx\conf\nginx.conf ... -
Tomcat6性能调优 出现java.lang.OutOfMemoryError: PermGen space
2010-08-03 13:51 1379Tomcat6在部署应用中,Server报错:java.lan ... -
APACHE 2.2.8+TOMCAT6.0.14配置负载均衡
2010-01-21 02:11 0目标: 使用 apache 和 tomcat ...
相关推荐
作为新手,了解JVM的工作原理和优化技巧是成为熟练Java开发者的重要步骤。以下是一些关于JVM的关键知识点: 1. **内存区域**: - **堆内存**:所有对象实例都在堆中分配内存,是JVM最大的内存区域,进行垃圾回收的...
Java虚拟机(JVM)内存管理与调优是Java开发中的关键环节,它涉及到程序的性能、稳定性和资源效率。JVM内存分为多个区域,包括堆内存、方法区、程序计数器、虚拟机栈和本地方法栈。理解这些区域的工作原理以及如何...
"深入Java虚拟机"这本书可能涵盖了JVM的更深入细节,如类加载机制的自定义、内存模型、垃圾收集器的原理与调优、JVM参数设置、性能监控工具的使用等。通过学习这些内容,开发者可以更好地理解和优化Java应用的运行...
### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成部分,它负责自动地回收不再使用的对象所占用的内存。本文将详细介绍Sun JDK 1.6 GC...
### JVM原理、内存模型、性能调优 #### 一、JVM原理概述 Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个独立于平台的运行环境,并且能够自动处理内存管理和垃圾回收等工作。JVM的核心...
"jvm.zip_jvm_knownobc_tomcat"这个压缩包包含了与优化Tomcat中的JVM设置相关的资料,主要关注如何有效管理和释放内存。 1. **JVM参数设置**: JVM的参数设置对于控制Tomcat内存分配至关重要。例如,`-Xms`和`-Xmx...
《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作原理,包括类加载机制、内存管理、字节码执行等核心概念。"gettingloaded.html" 可能是其中的一个章节,专门探讨了类的...
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
JVM_02 内存结构(堆、方法区)
简单的判断JVM内存溢出的方法
"浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...
在Java世界中,JVM(Java虚拟机)是运行所有Java程序的核心,它负责加载、验证、执行字节码,并管理内存。而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行...
总结来说,"JVM.rar_jvm_jvm 实现"项目是一个简化版的Java虚拟机实现,重点关注了基本的字节码解析、操作数栈的管理、加减运算和跳转控制。这个项目对于学习JVM的内部工作机制以及Java代码如何被解释执行非常有帮助...
在JVM内存模型和并发方面,Java 11引入了JEP 318(Enhanced Dependent Types for Compact Strings),这改进了字符串内存布局,减少了内存占用,从而提高了内存效率。 此外,JEP 315(JVM Constants API)为开发者...
一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保在运行时能找到对应的类。 2. 运行数据区:包括方法区、堆、栈、本地方法栈和程序计数器。方法区存储类信息,堆存放对象实例,栈处理方法调用,本地方法栈...
JAVA应用JVM原理及参数调优深入讲解视频.1 JAVA应用JVM原理及参数调优深入讲解视频.2 JAVA应用JVM原理及参数调优深入讲解视频.3 JAVA应用JVM原理及参数调优深入讲解视频.4 JAVA应用JVM原理及参数调优深入讲解视频.5 ...
1. **内存管理**:JVM内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈。堆内存用于存储对象实例,栈内存保存方法执行时的局部变量,方法区存储类的信息,程序计数器记录下一条要执行的指令,本地方法栈为...
JVM_启动参数_总结。详细介绍JVM的详细启动参数及JVM垃圾回收机制。
本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是Java平台的核心组件之一。它的主要任务是将编译后的Java类文件(.class文件)中的字节码转换...
linux nginx nginx_upstream_jvm_route