jvm参数理解和记录

jvm配置参数分为三大类:

1.跟踪参数:跟踪,监控JVM状态,用于程序员JVM调优及故障排查

2.堆分配参数:分配堆内存

3.栈分配参数:分配栈内存

各类配置参数常用参数:

1.-XX:+PringGC

2.-verbose:gc

Arthas 排除函数异常调用

watch com.example.demo.arthas.user.UserController * '{params, throwExp}' watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2 查看具体的异常信息

访问 再查看日志

https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-advanced

thread -n 线程是否有阻塞。

必要性:java和C/C++在内存方面的区别就是java有自己的虚拟机可以处理内存自动回收,交给虚拟机在方便的同时,也带来了一些问题,比如一旦出现内存泄露或溢出,不了解虚拟机就不好找出出现问题的原因。

java虚拟机在执行java程序的过程中会把他管理的内存划分为不同的数据区域。有各自的用途,也就是平常所说的java内存空间(内存区域)。

jvm参数理解和记录_第1张图片

程序计数器:线程独有,每个线程都会创建一个程序计数器,对应物理机器中的PC寄存器,或者说通过PC寄存器来实现的,可以看做是当前程序执行的字节码的行号指示器,指明接下来指令执行的位置。如果线程正在执行的是同一个java方法,这个计数器记录的正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法(底层由C/C++实现的),这个计数器值为空(undifined)。此内存区域是唯一一个在java虚拟机规范中没有规定任何OOM情况的区域。

java堆(Heap):堆空间是共享区域,创建对象和数组的存放空间,是java虚拟机中内存最大的一块,在虚拟机启动的时候创建,创建的对象实例都存放在这里。

java堆是垃圾回收管理的主要区域,因此也称作"GC堆",现在的垃圾收集器基本采用分代收集算法,分为新生代和老年代,新生代又分为Eden区和from,to区域,也称S0,S1区域,新建的对象存放在Eden中,随着垃圾回收处理,会在from和to之间复制(from和to完全一样大小,角色经常互换),每次的复制都会标记+1,达到一定次数之后,就会放到老年代,进行最后的回收。

堆大小的设置参数为-Xmx 最大内存空间 -Xms 最小内存空间 如果最大最小不一样的情况下,内存扩容和缩容也会花费时间,所以一般将这两个参数设置为一样的,堆内存的溢出和泄露都会报错OOM,如果是溢出的原因,可以适当调整堆内存大小,如果是泄露,需要找到代码问题。

堆的参数配置

-XX:+PrintGC 每次触发GC的时候打印相关日志

-XX:+UseSerialGC 串行回收

-XX:+PrintGCDetails 更详细的GC日志

-Xms 堆初始值

-Xmx 堆最大可用值

-Xmn 新生代堆最大可用值

-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.

含以-XX:SurvivorRatio=eden/from=den/to

总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,

这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.

方法区:和java堆空间一样,是各个线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量和即时编译后的代码等数据。也被称为非堆。

对于经常使用的HotSpot虚拟机,也会将方法叫做永久代,,仅仅是因为将GC分代收集迁移到了方法区,所以一般有将其理解为永久代说法,方法区无法分配内存时(类太多),也会报错OOM。

java虚拟机栈:java虚拟机栈和程序计数器一样,是线程私有的,栈的生命周期和线程一样,线程结束,栈也会销毁回收(这里栈也是会回收的,随着线程结束,数据使用完毕立马回收),虚拟机栈描述的是方法执行的内存模型,所以组成部分都是方法内的,比如:局部变量表,操作数栈,动态链接,方法出口等。一个方法的执行过程,对应了一个栈从入栈到出栈的全过程。

线程请求的栈深度大于虚拟机所允许的深度,会抛出StackOverFlowError异常。

参数配置为 -Xss

本地方法栈:本地方法栈类似虚拟机栈,主要处理的方法类型为native方法

主要的调优集中在堆内存中新生代老年代比例,eden和survivor(from-to)区域比例等

你可能感兴趣的:(java,linux,多线程,jar,经验分享,个人开发)