堆内存

JVM虚拟机 与 GC 垃圾回收

懵懂的女人 提交于 2020-02-12 16:31:24
一、JVM体系结构概述 1、JVM 与系统、硬件 ​ JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2、JVM 体系结构概览 ​ 3、类装载器ClassLoader 执行原理 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 ​ 4、类装载器ClassLoader装载流程(双亲委派) ​ 虚拟机自带的加载器 启动类加载器(Bootstrap)C++ 扩展类加载器(Extension)Java 应用程序类加载器(AppClassLoader)Java 也叫系统类加载器,加载当前应用的classpath的所有类 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式 注 : Execution Engine执行引擎负责解释命令,提交操作系统执行。 ​ 5、Native Interface本地接口 本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法

JVM学习笔记三:JVM堆内存调优(初步)

社会主义新天地 提交于 2020-02-10 17:25:51
永久代大小 在Java8中,永久代已经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。 元空间与永久代之间最大的区别在于: 永久带使用的JVM的堆内存,但是java8以后的元空间并不在虚拟机中而是 使用本机物理内存 。 因此,默认情况下, 元空间的大小仅受本地内存限制 。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由MaxPermSize 控制, 而由系统的实际可用空间来控制。 java7 -XX:PermSize:永久代空间 -XX:MaxPermSize:最大永久代空间 java8 最常用的三个参数: 默认的情况下,jvm分配的内存是总内存的“ 1 / 4 ”、而初始化的内存为“ 1 / 64 ” 在idea中,可以通过Run Configurations里面的VM arguments设置一个或多个参数: 一般来说,初始内存和最大内存要设置成相等的值。防止jvm内存不稳定。 若将jvm内存设置很小,就容易造成OOM:heap space的错误 如:设置VM参数:-Xms8m -Xmx8m -XX:+PrintGCDetails 写一个死循环一直生成大对象,gc回收跟不上new对象的速度。 String str = “hello” ; while(true) { str += str +

myeclipse优化配置

烂漫一生 提交于 2020-02-09 17:48:30
很多人都感觉myeclipse机子启动速度太慢,那是因为里面集成了太多的功能,但对于大多数人来说是不必要的,只需要根据自己正在用的项目加载相应的工具就行了。等到用到其他的时候再加载需要的。 <1> Myeclipse的安装目录下面有个名为eclipse.ini的文件, 用记事本打开后, 修改参数: 把-Xms128m改成-Xms256m 把-Xmx256m改成-Xmx512m <2> 去除不需要加载的模块Windows - Preferences --> General--> Startup and Shutdown 这时右侧就 显示出了Eclipse启动时加载的模块,根据需要去除一些模块。 <3>取消启动时自动验证项目配置文件 Window -> Preferences -> MyEclipse Enterprise Workbench-> Run Validation 在右侧的Validator列表中只保留 Manual 项就可以了 如果需要验证的时候只需要选中 文件,然后右键选择 MyEclipse - Run Validation就可以了 我机子的优化修改 1. Windows - Preferences --> General--> Startup and Shutdown原来自己机子上面启动很慢,但是现 在很快,因为几乎去掉了这里面所有不该启动地项目加载。 2

Java基础-JVM堆与栈

独自空忆成欢 提交于 2020-02-08 15:28:10
首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类的定义,静态资源 Student.class eg:Student stu = new Student(); //new 在内存的堆空间创建对象 stu.study(); //把对象的地址赋给stu引用变量 上例实现步骤:   a.JVM加载Student.class 到Code区 b.new Student()在堆空间分配空间并创建一个Student实例 c.将此实例的地址赋值给引用stu, 栈空间 java内存分区 运行时数据区即是java内存,而且数据区要存储的东西比较多,如果不对这块内存区域进行划分管理,会显得比较杂乱无章。程序喜欢有规律的东西,最讨厌杂乱无章的东西。   根据存储数据的不同,java内存通常被划分为5个区域: 程序计数器(Program Count Register)、本地方法栈(Native Stack)、方法区(Methon Area)、栈(Stack)、堆(Heap) 。 程序计数器(Program Count Register)   又叫程序寄存器。JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)

为什么栈的速度比堆快

自闭症网瘾萝莉.ら 提交于 2020-02-08 03:58:53
在栈上分配的内存系统会自动地为其释放,例如在函数结束时,局部变量将不复存在,就是系统自动清除栈内存的结果。但堆中分配的内存则不然:一切由你负责,即使你退出了new表达式的所处的函数或者作用域,那块内存还处于被使用状态而不能再利用。好处就是如果你想在不同模块中共享内存,那么这一点正合你意,坏处是如果你不打算再利用这块内存又忘了把它释放掉,那么它就会霸占你宝贵的内存资源直到你的程序退出为止。 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。 C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyorbelt)一样,StackPointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候

Java内存区域

霸气de小男生 提交于 2020-02-07 04:16:32
Java内存区域与OOM 文章目录 Java内存区域与OOM 引言 概述 内存区域 程序计数器 VM Stack虚拟机栈 Native Stack本地方法栈 Heap堆内存 方法区与常量池 Direct Memory直接内存 讲讲OOM 总结 引言 一句契合Java/C++使用者的话,“两者之间存在一堵由内存分配与GC技术筑建起来的高墙,墙里面的人想出去,墙外面的人却想进来”。 概述 Java有着自动的内存分配管理机制,也有自己独特的内存回收机制,只有熟练掌握这些知识,才能够真正地使用这门语言 内存区域 先上一个内存区域图: 如图,JAVA运行时内存区域分为 方法区(线程共享) 堆(线程共享) 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) 下面我们来讲讲这些内存区域所负责的工作。 程序计数器 JVM中的程序计数器与操作系统中的程序计数器功能是一致的,只不过操作系统的程序计数器记录的是下一条执行指令的地址,而JVM的程序计数器记录的是“当前”线程执行的字节码指令或者分支、循环、异常、线程恢复等功能的字节码支持。 程序计数器对不同方法的支持 Java method JNI 记录执行的字节码指令地址 Native方法这个计数器记录为空值 程序计数器是JVM中唯一不会出现OOM的地方。 VM Stack虚拟机栈 JVM中的虚拟机栈也是线程私有的

Java堆内存和栈内存

扶醉桌前 提交于 2020-02-06 15:53:08
转载自 https://www.journaldev.com/4098/java-heap-space-vs-stack-memory 及 https://blog.csdn.net/maoyeqiu/article/details/49614061# 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等; 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容; 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 Java堆内存 堆内存在Java运行时被使用来为对象和JRE类分配内存。不论什么时候我们创建了对象,它将一直会在堆内存上创建。垃圾回收运行在堆内存上来释放没有任何引用的对象所占的内存,任何在堆上被创建的对象都有一个全局的访问,并且可以在应用的任何位置被引用。 Java栈内存 Java的栈内存被用来线程的执行,他们包含生命周期很短的具体值的方法和在堆中使用这个方法对象的引用。栈内存是LIFO(后进先出)序列。当方法被调用的时候,堆内存中一个新的块被创建,保存了本地原始值和在方法中对其他对象的引用。这个方法结束之后,这个块对其他方法就变成可用的了。栈内存与堆内存相比是非常小的。 我们用下边的例子理解堆内存和栈内存 package com .

权限修饰符、

亡梦爱人 提交于 2020-02-05 02:36:03
3.1 修饰符分两大类: 权限修饰 和状态修饰 状态修饰符 final为最终的意思,用户修饰 方法、变量、类 放在前面; 例: 在变量中: 在类中: 在方法中: 意思是 引用类型可以变,意思是 栈内存的可以变,但是堆内存的不可以。 基本类型 是 堆内存的。 来源: https://www.cnblogs.com/gxtoo/p/12262337.html

iOS中内存管理的问题——堆和栈

杀马特。学长 韩版系。学妹 提交于 2020-02-04 05:46:53
计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同: 1 ) 栈区(stack ) 由编译器自动分配并释放 ,一般保存函数的参数值、局部变量 2 ) 堆区(heap ) 由程序员分配和释放 ,如果程序员不释放, 程序结束后,可能会由操作系统回收 3 ) 全局区(静态区) (static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块内存屈原中,未初始化的全局变量和静态变量在相邻的另一块区域, 程序结束后由系统释放 4 ) 文字常量去 存放常量字符串, 程序结束后由系统释放 5 ) 程序代码区 存放函数的额二进制代码 堆和栈的内存 1 、在 iOS 中,堆区的内存是所有应用程序共享 2 、堆中的内存分配是由系统来负责的 3 、系统使用一个链表来维护所有已经分配过的内存空间 4 、系统只是记录分配了多少字节给应用程序,并不管理具体类型的 “匿名” 5 、如果变量使用结束后,需要释放内存,oc中当一个变量的引用计数 == 0 ,就说明没有任何变量使用该空间,系统就直接收回 6 、如果程序员变量使用之后,不释放内存,该内存区域会永远被占用,内存泄露! 7 、野指针,当对象已经被释放,程序中的变量的指针,仍然指向该内存地址,如果再向该对象发送消息,就会报告野指针 来源: https://www.cnblogs.com

堆和栈的概念

十年热恋 提交于 2020-02-04 05:45:50
数据在内存中的存放 在计算机系统中,运行的应用程序的数据都是保存在内存之中。 不同类型的数据,保存的内存区域不同,其中包括: 1.栈区:(stack)由编译器自动分配并释放,一般存放函数的参数值,局部变量等。 2.堆区:(heap)由程序猿分配和释放,如果程序猿不释放,程序结束时,可能由操作系统回收。 3.寄存器区:用来保存栈顶指针和指令指针。 4.全局区(静态区):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。 5.文字常量区:存放常量字符串,程序结束后由系统释放。 6.程序代码区:存放函数的二进制代码。 栈区中的数据 应用程序启动后,操作系统会为应用程序在栈区开辟内存空间,用于存放局部变量,以及函数的参数等。 iOS主线程栈区大小为1M,MAC主线程栈区大小为8M. 栈区中的变量由编译器负责分配和释放。 栈区中的数据是以“栈”的形式管理的,先进后出(FIBO)。 访问栈区中变量的效率高,不会出现内存碎片。 栈区中的变量名(不带*)相当于是指向栈区数据的指针别名,变量名可以简化程序员的工作。 栈中地址是从高地址——>低地址。 堆中的数据 由于栈区的空间有限,iOS的应用程序中,对象都是建立在堆中的。 堆区包括系统内存和虚拟内存(硬盘内存),由所有正在运行的应用程序共享使用。