类加载子系统从网络或者文件系统加载class信息,加载的类放在一块成为方法区的内存空间。
方法区存放运行时常量池信息(包括 字符串 字面量 数字常量),都是通过常量池部分的内存映射。-xx:PermSize -xx:MaxPermiSize
java堆 是主要的内存工作区,几乎所有的java对象实例都存在java堆中。堆空间的所有进程都是共享的。
java 1.7支持NIO允许程序使用直接内存。直接内存是在java堆外的,直接的向系统申请内存区间。访问直接内存速度优于java堆,适合频繁读写的场合,这个内存的大小取决于系统内存大小。-XX:MaxDirectMemorySize 一般的认为直接内存比堆内存快40%
垃圾回收可以对方法区 java堆栈 和直接内存进行回收。
-XX:+PrintGC or -XX:+PrintGCDetail
-XX:+PrintGCTimeStamps(打印发生时间)
-XX:+PrintGCApplicationConcurrentTime 打印应用程序的执行时间
-XX:+PrintGCApplicationStoppedTime 可以打印应用程序由于GC而产生的停顿时间
-XX:+PrintReferenceGC 如果想跟踪系统内的软引用 弱引用 和 Finallize队列
-XX:+TraceClassLoading跟踪类的加载
-XX:+TraceClassUnloading跟踪类的卸载
-XX:Perm
堆溢出 -XX:+HeapDumpOnOutOfMemoryError
发生溢出导出线程转存的例子
每一个虚拟机都有一个私有的栈,栈中保存在局部变量和方法参数 java方法的调用
-Xss 线程的栈大小
本地方法栈 用于本地方法调用
pc 寄存器也是每一个线程私有空间,每一个java线程创建pc寄存器。
执行引擎是java虚拟机的最核心的组件之一,负责执行虚拟机的字节码
Xms堆内存 xss 栈内存
新生代配置 -Xmn
新生代分为 eden空间 from空间 to空间 三个部分 from和to空间也叫survior空间
-XX:SurviorRatio=eden/from=eden/to 空间比例关系
-XX:NewRatio 来设置老年代/新生代
老年代使用标记压缩法
标记压缩法就是从根节点出发标记所有可达对象做一次标记,然后将所有存活的对象压缩到内存的一端,最后清理边界外所有空间。
出入栈
java堆和数据密切相关,那么java栈就和线程执行密切相关
每一次函数调用都有一个栈被压入java栈,每一个函数调用结束,就有一个栈帧弹出java栈。
java方法有两种返回函数的方式,一种是正常的函数返回,一种是抛出异常。
操作数栈
操作数栈也是栈帧中重要内容之一,他主要用语保存计算过程的中间结果,同时作为计算过程中的变量的存储空间。
帧数据区
保存着访问常量池的指针,方便程序访问常量池。
栈上分配(-XX:EliminateAllocations默认打开 -XX:+printGC 打印gc日志)
对于线程私有对象,可以打散分配在栈上,而不是分配在堆上。不需要调用垃圾回收,提高系统性能。