第二章
-
类加载系统负责从文件系统加载class信息,加载类信息存储在方法区中,方法区中还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)
-
栈帧从java栈中被弹出有两种情况
- 正常返回,return返回
- 抛出异常
-
栈帧中至少包含局部变量表,操作数栈和帧数据区几部分 被局部变量表直接或间接引用的对象不会被垃圾回收
- 帧数据区保留访问常量池的指针,方便访问
- 函数返回或异常,需要恢复调用者栈帧
- 当出现错误,需要一个异常处理表(以上三小点都存在帧数据区)
- 栈上分配,不分配在堆上,可以在函数调用后自行销毁,不需要GC介入
第三章 常用虚拟机参数
虚拟机日志相关
- -XX:+PrintGC 打印gc日志
- -XX:+PrintGCDetails 更加详细的gc日志,还会使虚拟机在退出前打印堆的详细信息
- -XX:+PrintHeapAtGC jdk9删除,打印GC前后的堆使用情况
- -XX:+PrintGCTimeStamps 打印GC的时间,为虚拟机启动时的偏移量
- -XX:+PrintGCApplicationConcurrentTime 应用程序的执行时间
- -XX:+PrintGCApplicationStoppedTime 打印由于GC而导致停顿时间
- -XX:+PrintReferenceGC 用于跟踪软引用,虚引用等
- -Xloggc:log/gc.log 指定gc日志以文件形式存储,默认是打印到java控制台
类的加载/卸载的跟踪
1.可以使用参数-verbose:class
2.-XX:+TraceClassLoading 跟踪类的加载
3.-XX:+TraceClassUnloading 跟踪类的卸载
系统参数查看
1. -XX:+PrintVMOptions 打印虚拟机接受到的命令行显示参数。
eg: 控制台输出
VM option '+TraceClassLoading'
VM option '+PrintVMOptions'
- -XX:+PrintCommandLineFlags 打印传递给虚拟机的显示和隐式参数,隐式参数包括:命令行、虚拟机自行启动的默认参数
eg: 控制台输出
-XX:InitialHeapSize=132318080 -XX:MaxHeapSize=2117089280 -XX:+PrintCommandLineFlags
-XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation
堆参数配置
1.-Xmx 最大可用内存
2.-Xms 指定初始堆内存
3.-Xmn 可以设置新生代的大小。设置一个较大的新生代会减少老年代的大小。一般新生代是老年代的1/3-1/4
4.-XX:SurvivorRatio 用来设置新生代中eden空间和form/to空间的比例关系。含义: -XX:SurvivorRatio=eden/form=eden/to
5.-XX:NewRatio=老年代/新生代 来设置新生代与老年代的比例
提示:在实际工作中,可以直接将初始堆-Xms和最大堆-Xmx设置相等。好处是可以减少程序运行时进行的垃圾回收次数。提高程序的性能新生代的设置
XX:+HeapDumpOnOutOfMemoryError,使用此参数,可以在内存溢出时到处整个堆内存信息。配合使用的有-XX:HeapDumpPath,可以指出堆内存的存放路径
方法区和线程栈的设置
-
在jdk1.6,jdk1.7版本中,可以使用-XX:PermSize配置初始的永久区大小,-XX:MaxPermSize配置最大永久区
-
在jdk1.8中,永久区被彻底删除,使用新的元数据区存放类的元数据,默认情况下,元数据区只受系统可用内存的限制。
可以使用参数-XX:MaxMetaspaceSize指定永久区最大可用值,
-Xss 参数配置java栈大小
直接内存和堆内存分配
-XX:MaxDirectMemorySize 设置最大可用直接内存,如不设置,默认值为最大堆空间,当直接内存使用量达到MaxDirectMemorySize值时,就会触发垃圾回收,如果不能有效释放足够空间,直接内存溢出依然会引起系统的OOM。
访问速度:直接内存>堆内存
内存分配速度:直接内存<堆内存
所以直接内存适合于申请次数少,但访问频繁的场合