JVM堆内存设置
今天碰到了一个题目,讲的是关于堆内存的问题,题目如下
A.循环上万次的字符串处理
B.在一段代码内申请上百M甚至上G的内存
C.使用CGLib技术直接操作字节码运行,生成大量的动态类
D.不断创建对象 这个题目的答案选择C,我在做这个题之前对于JVM的了解几乎为0,所以看到这个题目基本就是随便选了一个,甚至没有看到原题中是持久区堆内存,只以为是内存溢出。所以在做完这个题目以后了解了一下JVM。 JVM是指Java虚拟机,JVM又分为了栈,堆,方法区,本地方法栈等几个部分,因为这个题目的缘故,重点了解了下堆。 1.栈
每一个线程执行的时候都会在栈申请开辟一块栈帧。每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
2.方法区
方法区用来存放要加载的类信息、静态变量、final类型的常量、属性和方法信息。
3,本地方法栈
本地方法栈用来支持native方法的执行,存储每个native方法的调用状态。
4.堆
代码中每new一个新对象,都会在堆中创建,然后下面重点了解了一下堆。 堆内存设置
堆分为两部分,Permanent和heap,Permanent Generation即持久带。
heap又分为Young Generation和Old Generation,即年轻代和年老代。
年轻代又分为Eden和Survivor。
Survivor又分为From和To。 年轻代
所有新创建的对象都放在新生代中,新生代的作用主要就是回收那些生命周期比较短的对象。
年老代
相对应的,老年代就存放那些生命周期比较长的对象。 这也就涉及到了垃圾回收机制。
因为年轻代中对象存活时间短,所以采用Copying算法,简单说就是把存活对象从一个区域拷贝到另一个区域,对应年轻代中就是Eden和From,To之间的拷贝,当触发GC进行回收依然空间不足就回进去年老代,年老代满了,进行Full GC,腾出的空间依然不足的话,就回出现内存溢出的错误OutOfMemory。比如开头写的那个题目中的ABD选项都是该原因导致的内存溢出。 而持久区则不同,持久区用于存放静态类型数据,如Java Class, Method 等。持久代对垃圾回收没有显著影响。但是有些应用可能动态生成或调用一些Class,例如前面题目的C选项,在这种时候往往需要设置一个比较大的持久代空间来存放这些运行过程中动态增加的类型。 最后简单记录垃圾回收的一点知识
串行GC是在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式。
并行回收GC是在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。
并行GC要与旧生代的并发GC配合使用
旧生代的GC与新生代不同,对象存活的时间比较长,比较稳定,因此采用Mark算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。
JVM堆内存设置的更多相关文章
- 【转】JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- [转]JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM 堆内存设置原理
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM 堆内存设置原理(转)
堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM堆内存设置和测试
1. Java虚拟机内存结构 划分新生代和老年代,这样只在新生代分配内存,从而简化了新对象的分配.另外新生代和老年代使用不同的GC算法,可以更有效的清除不再需要的对象.从上图可以看出,JVM内存由yo ...
- 【转】jvm 堆内存 栈内存 大小设置
原文地址:http://blog.csdn.net/qh_java/article/details/46608395 4种方式配置不同作用域的jvm的堆栈内存! 1.Eclise 中设置jvm内存: ...
- jvm 堆内存 栈内存 大小设置
4种方式配置不同作用域的jvm的堆栈内存. 1.Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse ...
- JVM堆内存监测的一种方式,性能调优依旧任重道远
上月,由极客邦.InfoQ和听云联合主办2016 APMCon中国应用性能管理大会圆满落下帷幕.会上,Java冠军Martijn Verburg进行了一场Java and the Machine的分享 ...
- 巩固java(二)----JVM堆内存结构及垃圾回收机制
前言: 我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构 ...
随机推荐
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...
- 深入理解Java内部类
内部类就是定义在一个类中的另外一个类,是一种从属关系.在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度么?现在才大致能知道这种设计的优势是大于 ...
- Ambari安装之部署单节点集群
前期博客 大数据领域两大最主流集群管理工具Ambari和Cloudera Manger Ambari架构原理 Ambari安装之Ambari安装前准备(CentOS6.5)(一) Ambari安装之部 ...
- Python基础之常用模块(一)
模块本质就是一个.py文件,在安装目录下的lib文件夹下可以看到 模块分为三个部分:内置模块(存在于解释器中),第三方模块(lib文件夹下),自定义模块(自己定义的) 1.time模块 import ...
- Java并发包基石-AQS详解
目录 1 基本实现原理 1.1 如何使用 1.2 设计思想 2 自定义同步器 2.1 同步器代码实现 2.2 同步器代码测试 3 源码分析 3.1 Node结点 3.2 独占式 3.3 共享式 4 总 ...
- Ansible 运维自动化 ( 配置管理工具 )
背景 出差背景,要搞项目的自动化部署.因为只直接对接生产分发,机器又非常多,这样以往使用的bat只能作为应急方案了,还是得考虑使用专业化的工具来做这个事情! 当下有许多的运维自动化工具( 配置管理 ) ...
- jmeter问题处理随笔1 - CSV取值数据异常处理(包含"号,","号的情况)
背景 jmeter测试中通过CSV进行用例数据的管理,在result断言中间需要使用json格式的数据,会包含 " ",",这个时候发现CSV取值会报错或者乱码 解决 用 ...
- mysql内部级联删除
1,创建user表 属性:id,name 2,创建userInfo表 属性:id,age 在userInfo表中创建外键id,如下图: 在user表中插入两个用户信息 (1,'1'),(2,'2') ...
- windows下配置cygwin和dig的环境变量
配置cygwin和dig的环境变量 打开"控制面板"("开始">"设置">"控制面板"),然后双击" ...
- Hadoop - 国内各站点最高温度、气压和风速统计
版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处(http://www.cnblogs.com/mikevictor07/),以下内容为个人理解,仅供参考. 一.简介 该实例统计国内 ...