1、java虚拟机所掌握的内存区可以分为所有线程使用和多线程独立使用的部分:方法区Method Area 、堆 heap。 虚拟机栈vm stark 、本地方法栈 native method stack、程序计数器 program Couter register.
2.程序计数器:每条线程独立拥有 用来顺序执行自己的程序保证顺序 多线程之间独立
3。java虚拟机栈:线程私有 生命周期是和线程共存 调用方法是会往栈中存放栈帧:存放局部变量表、方法出口、连接等。一个方法对应一个栈帧 方法开始执行就入栈 方法执行结束时出栈。 局部变量表在类编译时就已经确定所占空间 方法执行时不会影响 。 线程申请的深度大于允许的深度 会抛出StackOverflowError 如果申请的内存空间不能满足是抛出outofmemoryError。 为java虚拟机执行java方法(字节码)。
4.本地方法栈:为虚拟机提供native方法服务。
5.java堆:所有线程所共享的区域 在虚拟机启动时创建,存放对象的实例。可以物理上不连续空间,逻辑上连续即可。
6.方法区:多个线程公用 中间有:被加载的类、常亮、静态变量、即使编译后的代码。
7.运行时常量池是方法区的一部分。class文件中string的intern方法存放的常亮池就是这里。
8直接内存:不是java虚拟机中的部分 但是经常使用。
9.对象的访问有两种方式:使用语柄和直接指针 使用语柄会在java堆中开辟一部分用来当做语柄池其中存放的是到实例对象指针(java堆中的实例池)和类型的指针(方法区)
使用语柄的方式可以更加方便不用去改变栈中变量表中所存放的语柄。 而直接指针方式需要时改变栈中变量表中所存放的地址。可以加快速度去快速访问(提升很小)但是积少 成多。
内存方面的异常以后解决。。。。。。
第三章 GC
什么时候需要优化?当垃圾处理成为系统达到更高并发量的瓶颈时,需要进行监控调节。
1.引用或计数法:给对象一个引用的计数器当该对象有人使用时给它计数,引用失效是减去 当计数器为0就是不在使用。 缺点 难以解决对象之间互相调用的问题。
2.根搜索算法:通过一系列名为”GC ROOTS”的对象作为起点,从这些节点向下搜索。 搜索过的路径叫做引用链 当某个对象没有和任一一个引用链相连时,证明对象不可用可回收。 可以作为”GC ROOTS”的对象可以为 虚拟机栈(栈帧中的本地变量表)中的对象、方法区中的类静态属性引用的对象、方法区中的常量引用的对象、本地方法区中native所引用的对象。
3.强引用
使用new 关键字 一个对象对应一个新实例的对象 强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候。
4.软引用
参考 http://blog.csdn.net/xiaofengcanyuexj/article/details/45271195