运行时常量池(JDK1.7被移出)
存放对象实例或数组
、新生代和老年代
线程私有
、栈
线程私有
、Native
线程私有
、行号指示器
、无OOM
字节码解释器工做时就是经过改变程序计数器的值来选取下一条须要执行的字节码指令。java
选择哪一种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。数组
使用句柄 -> 句柄池安全
直接指针微信
由于程序计数器中存储的数据所占空间的大小不会随着程序的执行而发生改变。多线程
JDK1.6在常量池建立与此String内容相同的字符串;常量池 建立字符串
->返回引用
JDK1.7在常量池中记录Heap中首次出现的引用,并返回该引用。常量池 记录引用
->返回引用
app
String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println((str1.intern() == str1)); //JDK1.6:false //JDK1.7:true
CAS(Compare And Swap 比较交换),是无锁执行者,能够用来保证线程执行的安全性。核心思想以下:函数
执行函数:CAS(V,E,N)
其包含3个参数布局
若是V值等于E值,则将V的值设为N。若V值和E值不一样,则说明已经有其余线程作了更新,此时当前线程不执行更新操做,但能够选择从新读取该变量再尝试再次修改该变量,也能够放弃操做。ui
CAS是一条CPU的原子指令,完成某个功能的一个过程的原语的执行必须是连续的,不会形成所谓的数据不一致问题。spa
1 字节 = 1 byte = 8 bit
将堆的最小值-Xms参数与最大值-Xmx参数设置为同样便可避免堆自动扩展。
java.lang.OutOfMemoryError: Java heap space
堆内存溢出(最多见的),能够Dump堆转储快照信息查看具体问题。
java.lang.StackOverflowError
虚拟机栈内存溢出 - 超出当前方法栈深度
java.lang.OutOfMemoryError: unable to create new native thread
多线程致使内存溢出,可经过“减小最大堆”和“减小栈容量”来换取更多的线程。
java.lang.OutOfMemoryError: PermGen space
出现这个异常说明运行时常量池属于方法区的一部分,能够手动设置MaxPermSize大小修改。 jdk1.7已经将常量池从方法区移出,jdk1.8彻底删除永久代,全部jdk1.8不会出现此OOM。
java.lang.OutOfMemoryError
由DirectMemory(本机直接内存)致使的OOM,没有明显的异常说明,由于这里的内存不足时它自己计算出来,并手动抛出异常。
-XX:+HeapDumpOnOutOfMemoryError
可让虚拟机在出现OOM时Dump出当前的内存堆转储快照以便过后进行分析
-Server -XX:+DoEscapeAnalysis
开启逃逸分析,直接栈上分配
-XX:MaxDirectMemorySize
指定本机直接内存容量,默认为java堆最大值-Xmx
https://my.oschina.net/gmarshal
欢迎关注个人我的微信订阅号:(听说这个头像程序猿专用)