提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
哔哩哔哩:添加链接描述
一、本地方法栈
本地方法运行的内存空间
二、堆
new出的对象就是堆
堆内存是共享的,要考虑线程安全
堆有GC垃圾回收,一旦new出的对象不再使用,就会进行垃圾回收
堆的溢出:new出的对象一直没有销毁,并再添加 , OutofMemeryError
jps查看有哪些进程
jmap -heap 18756查看堆内存的使用情况,Eden 是新创建内存区域大小
jconsole和jvisualVM都是图形化界面,更直观易懂,无需下载
三、运行时常量池
常量池:提供给解释器的执行命令,包含运行的类
运行时常量池:当类被加载,常量池会被加入运行时常量池,并把符号地址变成真实的地址
方法区:存储跟类相关的东西,.class 、classLoder 、常量池
内存溢出:1.8后会导致元空间溢出,1.8之前会导致永久代溢出
内存溢出:spring和mybatis的动态字节码技术使用了cglib中的classwriter,继承自classvistor,会创建很多类,所以有时候内存溢出可能是框架选择的原因。
四、串池 StringTable
a="a"
b="b"
c=a+b
d="a"+"b"
c!=d 因为c是new StringBuffer.append("a").append("b")是堆中的
d是编译时优化,认为是串池中的"ab",即=="ab"
1.6 a.intern 如果串池中不存在,则会复制一份放入串池
1.8 a.intern 如果串池中不存在,则会直接放入串池
返回值都是串池中的,如果是new出来的,返回值则是堆中的
1.8后将stringtable移入堆中(原来在方法区)
jvm调优:桶的个数越多,hash越分散,查询速度就越快。例如,如果常量值比较多,可以调大Stringtable的大小,速度会快很多
jvm调优:当存储常量可能很多重复时,可以用string.intern来节省存储空间