JVM
JVM组成
使用Java语言编写.java Source Code文件,通过javac编译成.class Byte Code文件。 class loader类加载器:将所需的类加载到内存,必要时将类实例化成实例。
图中中间部分是进程的内存逻辑结构,称为Jvm运行时区域,由下面几部分构成: 方法区:所有线程共享的内存空间,存放已加载的类信息、常量和静态变量。 heap堆:所有线程共享的内存空间,存放创建的所有对象。堆是靠GC垃圾回收器管理的。 Java栈:每个线程会分配一个栈,存放线程用的本地变量、方法参数和返回值等。 PC寄存器:PC, 即Program Counter,每一个线程用于记录当前线程正在执行的字节码指令地址。因为线程需要切换,当一个线程被切换回来需要执行的时候,知道执行到哪里了。 本地方法栈:为本地方法执行构建的内存空间,存放本地方法执行时的局部变量、操作数等。
所谓本地方法,简单的说是非Java实现的方法,例如操作系统的C编写的库提供的本地方法,Java调用这些本地方法接口执行。但是要注意,本地方法应该避免直接编程使用,因为Java可能跨平台使用,如 果用了Windows API,换到了Linux平台部署就有了问题。
分代堆内存
Heap堆内存分为 新生代:刚刚创建的对象 伊甸园区 存活区Servivor Space:有2个存活区,一个是from区(图中s0或s1),一个是to区。它们大小相等、地位相同、可互换。 to指的是本次复制数据的目标区 老年代:长时间存活的对象 持久代:JVM的类和方法
内存调整
-X选项 稳定的选项
-XX:选项名称 beta选项,但是有些就一直保留下来了
参数 说明 举例
-Xms 设置应用程序初始使用的堆内存大小(新生代+老年代) -Xms2g
-Xmx 设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降 -Xms4g
-XX:NewSize 设置初始新生代大小
-XX:MaxNewSize 设置最大新生代内存空间
-XX:NewRatio 以比例方式设置新生代和老年代 -XX:NewRatio=2new/old=1/2
XX:SurvivorRatio 以比例方式设置eden和survivor -XX:SurvivorRatio=6 eden/survivor=6/1 survivor/new=1/8
-Xss:设置线程的栈大小
在bin/catalina.sh中增加
JAVA_OPTS="-server -Xmx512m -Xms128m -XX:NewSize=48m -XX:MaxNewSize=200m"