java虚拟机内存
2022-08-30 19:51:54 0 举报
AI智能生成
JVM知识点概览
作者其他创作
大纲/内容
线程私有
程序计数器
控制字节码的执行顺序
每个处理器都有一个独立的程序计数器,用于保存和恢复各个线程之间切换的上下文环境
java方法:记录正在执行的虚拟机字节码指令的地址
本地方法(c语言实现):计数器的值为空(undeifned)
java虚拟机栈
栈帧
每个方法被执行时,都会创建一个栈帧
存储局部变量,操作数栈,动态链接,方法出口
每次方法调用对应了虚拟机栈的入栈,执行完毕,对应了虚拟机栈的出栈。(debug模式的调试栈信息)
栈
我们一般笼统说的"栈"就是java虚拟机栈
有时候我们说的“栈”其实只代表局部变量表(Local Variables)
https://wenku.baidu.com/view/37592fa380d049649b6648d7c1c708a1284a0a3e.html
https://wenku.baidu.com/view/37592fa380d049649b6648d7c1c708a1284a0a3e.html
异常
Java 虚拟机规范允许 Java 栈的大小是动态的或者是固定不变的
如果采用固定大小的 Java 虚拟机栈,那每一个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出 StackOverflowError 异常
如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个 OutOfMemoryError 异常
如果采用固定大小的 Java 虚拟机栈,那每一个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出 StackOverflowError 异常
如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个 OutOfMemoryError 异常
虚拟机栈大小的设置: -Xss10m,单个线程栈的大小,可以看到是设置所有栈帧的容量大小,而不是个数或者说深度大小
本地方法栈
其结构,实现和虚拟机栈类似,区别就是其加载的是本地方法(Native)
其异常情况也和虚拟机栈一样
线程共享
堆
虚拟机所管理的内存中最大的一块
存储了几乎所有对象实例,例外的情况暂时不做了解
java垃圾回收管理的就是java堆内存
空间区分
新生代
Eden空间
From Survivor空间
To Survivor空间
老年代
堆大小通过-Xmx和-Xms设置
异常
堆中内存完成实例引用分配,但无内存可分配存储对象真实数据,且内存无法扩容,抛出OOM
字符串常量池
只有直接用 ""修饰的字符,才会被加入到常量池中,当再次用 ""创建的时候,会首先从常量池中去获取
https://blog.csdn.net/Tao_Yuanqiang/article/details/108040262
https://blog.csdn.net/Tao_Yuanqiang/article/details/108040262
子主题
方法区(非堆)
元空间
类,方法的元数据
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
直接内存
https://www.cnblogs.com/duanxz/p/3520829.html
永久代
jdk1.8倍移除,在jdk1.6时其涵盖jdk1.8中的字符串常量池+元空间,jdk1.7时你函盖了现在的元空间,字符串常量池被迁移到堆中

收藏

收藏
0 条评论
下一页