图来自JavaGuide
程序计数器
java堆
字符串常量池的变化:
方法区是所有线程共享的内存,在java8以前是放在JVM内存中的,由永久代实现,受JVM内存大小参数的限制,在java8中移除了永久代的内容,方法区由元空间(Meta Space)实现,并直接放到了本地内存中,不受JVM参数的限制(当然,如果物理内存被占满了,方法区也会报OOM),并且将原来放在方法区的字符串常量池和静态变量都转移到了Java堆中。
永久代逻辑上存在,物理上不存在
堆内存调优
-Xms 1m 设置初始化内存分配大小 默认本机内存1/64
-XX:+PrintGCDetails 打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError: 导出OOM异常文件
虚拟机栈
- 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
- 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
- 8大基本类型、对象引用、实例方法
正在执行的方法一定在栈的顶部
不涉及,垃圾回收主要指堆内存,当栈帧弹栈后,内存就会释放
栈内存分配越大越好吗?
方法内的局部变量是否线程安全
堆、栈的区别
方法区
- 方法区是各个线程共享的内存区域
- 主要存储静态变量、变量、类的信息、运行时常量池
- 虚拟机启动的时候创建,关闭虚拟机时释放。
- 若方法区中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace
运行时常量池
直接内存
GC垃圾回收
发生在堆。
垃圾回收算法
标记–清除算法
首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。
缺点:
- 效率不高
- 产生大量不连续的内存碎片
复制算法
内存分为大小相同的两块,每次使用其中的一块,当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。
缺点:
标记整理算法
标记过程仍然与“标记–清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
根据老年代的特点提出的一种标记算法,多了整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景。
分代收集算法
对象的生命周期不同,故根据对象的存货周期在堆中分为新生代、老年代,根据其特点选择合适的垃圾收集算法。
类的加载过程
主要分为七个过程
双亲委派机制
当某个类加载器需要加载某个.class
文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,下一级才会去加载这个类。
优点:
JVM调优
JVM调优主要是调整年轻代、老年代、元空间的内存大小及使用的垃圾回收器。
-Xms : 设置堆的初始化内存大小
-Xmx :设置堆的最大内存大小
-XX:SurvivorRatio=3,表示年轻代中的分配比率survivor:survivor:eden = 1:1:3
-XX:newSize=n 设置年轻代的初始大小
-XX:MaxNewSize 设置年轻代的最大大小, 初始大小和最大大小两个值通常相同
-
线程堆栈的设置
默认1M,但128k就够用了
-Xss 对每个线程stack大小的调整,-Xss128k
原文地址:https://blog.csdn.net/weixin_59864324/article/details/134699677
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7937.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!