JVM学习笔记-内存管理

第一章 内存分配

1. 内存区域。

方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离)。

1) java虚拟机栈:线程私有。描述的是java方法执行的内存模型:栈帧,用户存储 局部变量表,操作数栈,动态链接,方法出口等信息。

局部变量表在编译时即可完全确定!如果线程请求的栈深度大于 规定的深度,StackOverflowError.

2) 本地方法栈,类似。

3)堆:垃圾收集器管理的主要区域。线程共享。

4)方法区: 各个线程共享。存储:加载的类信息,常量,静态变量,即时编译后的代码数据。习惯称作:永久待。可以不选择垃圾回收(特殊情况有必要)。

运行时常量池(属于方法区),编译时期的字面量和符号引用。运行期间可以将新的常量放入常量池:String.intern() 方法。

2. 对象创建

1) new的执行: 首先,能否定位到一个类的符号引用,这个符号引用代表的类是否已被加载、解析和初始化。通过后,为新生对象分配内存,内存大小在类加载完后可确定。内存分配有两种方式:指针碰撞和空闲列表。

对象头:这个对象是哪个类的实例,如果找到类的元数据信息,对象的哈希码,GC分代年龄等。

最后一步是init,按照程序员的意愿进行初始化。

2) 对象的内存分布:对象头,实例数据,和对齐填充。

3)对象访问的两种方式:句柄访问  和 直接指针访问。栈中存放 reference引用

3. 栈溢出

1)如果线程请求的栈深度大于虚拟机所允许的最大深度,StackoverflowError

2)如果虚拟机在扩展栈时无法申请足够内存,则 OutofMemoryError

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右一般小的应用, 如果栈不是很深,
应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。

threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”

JVM学习笔记-内存管理

时间: 2024-10-10 17:18:16

JVM学习笔记-内存管理的相关文章

2015 IOS 学习笔记 内存管理,页面跳转 ——蓝懿教育

——————————内存管理———————————————— 手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSM

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

Cocos2d-x学习笔记—内存管理机制

Cocos2d-x 3.x内存管理机制 1:C++内存管理 1-1:内存分配区域 创建对象需要两个步骤:第一步,为对象分配内存:第二步,调用构造函数初始化内存.在第一步中,可以选择几个不同的分配区域.这几个区域如下: (1) 栈区域分配.栈内存分配运算内置于处理器的指令集中,效率很髙,但是分配的内 存容量有限.由处理器自动分配和释放,用来存放函数的参数值和局部变量的值等.在执 行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放. (2) 堆区域分配.从堆上分

C++学习笔记-内存管理与指针

一.使用new和delete时,应遵循以下规则: 1.不要使用delete来释放不是new分配的内存. 2.不要使用delete释放同一个内存块两次. 3.如果使用new[]为数组分配内存,则应使用delete[]来释放. 4.如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放. 5.对空值指针应用delete是安全的. 二.句点操作符和箭头操作符的规则: 1.如果结构标识符是结构名,则使用句点操作符: 2.如果标识符是指向结构的指针,则应使用箭头操作符(->)

Objective-C学习笔记 内存管理

引用计数 每个对象都有一个与之相关联多整数,被称作它的引用计数器或保留计算器,当某段代码需要访问一个对象时,该代码就将该对象的保留计数器值加1,表示我要访问该对象,当这段代码访问结束的时候,将对象的保留计数器数值减1,表示不再访问该对象了.当保留计数器的值为0时,表示不再有代码访问该对象了,此时它将被销毁同时占用的内存被回收. 对象的保留计数器值初始值为1.当一个对象即将要被销毁的时候,OC会向对象发送一条dealloc消息,这条消息可以在自己的对象中重写. 常见的几种调用方法: -(id) r

JVM学习笔记(四)------内存调优【转】

转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 对JVM内存的系统级的调优主要的目的是减少GC的频率和Fu

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

JVM学习笔记(一)------基本结构

从Java平台的逻辑结构上来看,我们能够从下图来了解JVM: 从上图能清晰看到Java平台包括的各个逻辑模块,也能了解到JDK与JRE的差别 对于JVM自身的物理结构,我们能够从下图俯视一下: 对于JVM的学习,在我看来这么几个部分最重要: Java代码编译和运行的整个过程 JVM内存管理及垃圾回收机制 以下将这两个部分进行具体学习 JVM学习笔记(一)------基本结构,布布扣,bubuko.com

JVM 学习笔记

JVM  ----Java  Virtual Machine   (熟称:JAVA虚拟机),JVM 在执行JAVA程序的过程中将内容划分为若干个区域,其有各自的用途和管理机制.如下图: 1.  程序计算器(Program Counter Register)  --  是当前线程所执行字节码的行号指示器,通过改变其值来实现执行不同的代码指令.内存占用小,线程私有,支持多线程处理(多线程时,每个线程有一个独立程序计算器,已达到各自互不影响), 也正是由于这些特点,该区域是JVM规范中唯一没有规定任何