JVM 为什么进行内存区?
随着对象数量的增加,JVM 内存使用率也在增加,如果 JVM 内存使用率达到 100%, 则无法继续运行程序。为了让 JVM 内存可以被重复使用,需要进行垃圾回收。为了提高垃圾回收的效率,JVM 将内存区域进行了划分。
方法区中的方法的执行过程?
垃圾回收算法哪个阶段会stop the world?(坑)
GC只会对堆进行GC吗?(坑)
JVM调优
JVM调优的常用命令有哪些?
常用命令:
1、jps:查看进程及其相关去信息
2、jmap:用来生成dump文件和查看堆相关的各类信息的命令。
3、jstat:查看jvm运行时的状态信息
4、jstack:查看jvm线程快照的命令
5、jinfo:查看jvm参数和动态修改部分jvm参数
常用参数:
1、-Xms:初始化堆大小
2、-Xmx:最大堆大小
3、-Xmn:新生代的内存空间大小
4、-XX:SurvivorRatio
5、-Xss:每个线程的堆栈大小
6、-XX:PermSize:设置永久代初始值
7、- XX:MaxPermSize:设置永久代最大值
如果我要在 JVM 上跑一个项目,JVM 参数一般怎么设置?
JVM 参数的设置取决于项目的需求和性能要求。以下是一些常见的 JVM 参数设置建议:
- 堆内存设置:使用-Xmx和-Xms参数设置堆的最大和初始大小。例如,设置为-Xmx1024m和-Xms512m将分配1GB的最大堆和512MB的初始堆。
- 垃圾回收器选择:根据项目的需求选择合适的垃圾回收器。可以使用-XX:+UseParallelGC启用并行垃圾回收器,-XX:+UseConcMarkSweepGC启用并发标记清除垃圾回收器,或-XX:+UseG1GC启用G1垃圾回收器。
- 并发线程数设置:使用-XX:ParallelGCThreads参数设置并行垃圾回收器的线程数。例如,-XX:ParallelGCThreads=4将设置4个并行线程。
- 线程栈大小设置:使用-Xss参数设置线程栈的大小。例如,-Xss256k将设置线程栈大小为256KB。
- 类加载优化:使用-XX:+UseFastClassInitialization参数启用快速类加载初始化。这可以提高类加载的性能。
- GC 日志设置:使用-XX:+PrintGC和-XX:+PrintGCDetails参数启用详细的垃圾回收日志。这对于调试和性能分析很有帮助。
- 其他性能调优参数:还有许多其他的JVM参数可以根据项目需求进行调整,例如-XX:MaxMetaspaceSize设置元空间的最大大小,-XX:CompileThreshold设置JIT编译的阈值等。
请注意,以上参数只是一些常见的设置建议,具体的设置应该根据项目的需求和性能测试结果进行调整。
2 JVM异常问题?
StackOverflowError(线程请求栈深度超过虚拟机所允许的最大深度)
OutOfMemoryError(堆内存不够用)
PermGen space(方法区内存不够用)
对于一个jvm来说,锁创建的最大线程数量是多少?
JVM 创建的最大线程数量取决于操作系统的限制、JVM 堆内存配置以及每个线程的栈大小。理论上,最大线程数由可用内存和每个线程栈的大小决定,通常情况下操作系统和内存会成为限制因素,而 JVM 本身没有硬性限制。
Full GC介绍一下?
Full GC 是对整个 Java 堆(新生代 + 老年代,在 Java 8 前还包括永久代/元空间)进行的全面垃圾回收,采用标记–清除或标记–整理算法,需暂停所有线程,停顿时间较长。
频繁minor gc怎么办?
频繁的 Minor GC 通常意味着新生代中的对象频繁地被垃圾回收,可能是因为新生代空间设置的过小,或者是因为程序中存在大量的短生命周期对象(如临时变量)。
可以使用 GC 日志进行分析,查看 GC 的频率和耗时,找到频繁 GC 的原因。
频繁的Full GC怎么办?
频繁的 Full GC 通常意味着老年代中的对象频繁地被垃圾回收,可能是因为老年代空间设置的过小,或者是因为程序中存在大量的长生命周期对象