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问题。