1.jvm (java虚拟机)一处编译到处运行,兼容各种操作系统
1.1程序计数器 jvm指令 解释器 编译成2进制字节码,命令按顺序执行地址
线程私有(每个线程都有自己的计数器)
没有内存溢出
1.2 栈,线程运行需要的内存(栈内元素就是栈帧,每一个方法运行需要内存)
栈是由多个栈帧即是方法组成
每个线程只能有一个活动栈 ,对应执行当前的方法(栈顶部方法压栈操作)
(变量是否是共享的)
局部变量是私有的线程是安全
线程内存溢出内存溢出 top检查 查询进程下所有线程ps H -eo pid,tid,%cpu |grep 6622
jstack 进程号 根据线程id转16进制查询对应代码
1.3本地方法栈 Java 举例Object hashcode方式native C方法(本地运行内存空间)
1.4 堆,线程安全问题,线程共享,垃圾回收机制
堆内存溢出 jps 查看堆进程 工具jmp -heap 进程号 新创建的对象在Eden区
jconsole
jvisualvs
1.5方法区(线程共享的区)类相关信息成员方法,构造方法
方法区组成
运行时常量池指令符号地址,永久代1.8之前一个实现之后元空间,可能会抛出内存溢出异常
jdk1.6 copy堆中常量到串池中
jdk1.8 元空间
常量与串池(StringTable)关系,每定义一个常量执行完改一行代码(懒惰加载),会放入到stringTable中 hashtable结构,不能扩容。变量引用,常量不变引用,Javac 编译时从串中指向已存在的变量避免重复创建对象。字符串拼接原理1.8是Stringbuilder,编译时优化。intem方法可以将没有的字符串放入串池中。
常量字符串都在串池中,动态引用字符串都在堆中
2.JRE 基础类库
3.JDK基础类库+编译