JVM(01)深入理解JVM内存区

Java SE体系架构

jdk1.8


运行时常量池

    Class文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。

  符号引用: 

  字面量:String

a =“liang”

nJDK1.6

  运行时常量池在方法区中

nJDK1.7

   运行时常量池在堆中

nJDK1.8

  去永久代:使用元空间(空间大小只受制于机器的内存)替代永久代

  永久代参数  -XX:PermSize;-XX:MaxPermSize=100M   超过100M OOM()

   元空间参数  -XX:MetaspaceSize;-XX:MaxMetaspaceSize

     永久代来存储类信息、常量、静态变量等数据不是个好主意, 很容易遇到内存溢出的问题。

     对永久代进行调优是很困难的,同时将元空间与堆的垃圾回收进行了隔离,避免永久代引发的Full GC和OOM等问题;

深入分析栈和堆

功能

Ø以栈帧的方式存储方法调用的过程,并存储方法调用过程中基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放;(stackoverflow,OOM)

而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中;

线程独享还是共享

Ø栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。

Ø堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

空间大小

栈的内存要远远小于堆内存,栈的深度是有限制的,可能发生StackOverFlowError问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。