Java虚拟机的内存模型

Aug 16, 2016


一、java虚拟机内存模型

  java内存模型如何划分,一般人们会粗糙的划分为堆和栈,其中堆是垃圾回收的区域,对象 在这里完成自己的生命周期。 详细一点的划分,一般把java内存划分为:方法区、堆、栈、本地方法区、PC寄存器。

方法区:
  类加载器将java类加载后,相应的类信息会保存在方法区,包括静态变量,构造器,方法等。 方法区由多个线程共享。

堆:
  对象的产生,活动,终结区域。堆是由多个线程共享的。

pc寄存器:
  每个线程都有自己的pc寄存器,保存jvm当前正在执行的指令地址。

栈:
  每个线程都有自己的栈,以栈贞的形式保存局部变量,只有压栈和出栈操作。主要保存局部变量 ,中间结果等。

本地方法栈:
  支持一些本地方法调用,与栈类似。

二、IntelliJ IDEA 设置JVM运行参数。

  打开IDEA安装目录下的bin文件夹,可以看到两个文件:

  • idea.exe.vmoptions:32位虚拟机设置
  • idea64.exe.vmoptions:64位虚拟机设置

  我们以64位虚拟机设置文件为例,看下具体需要设置的内容:

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

  下面看一些具体的设置:

  1. -Xms Java Heap初始值。
  2. -Xmx Java Heap最大值。
  3. -Xmn Java Heap Young区大小。
  4. -Xss 每个线程栈的大小。
  5. -XX:InitialCodeCacheSize:初始代码缓存区大小
  6. -XX:ReservedCodeCacheSize:保留的代码缓存区大小
  7. -XX:+UseConcMarkSweepGC:设置老年代并发收集
  8. -XX:SoftRefLRUPolicyMSPerMB=50:还没搞的十分懂,和软引用有关。
  9. -XX:+PrintGC:打印GC日志
  10. -XX:PrintGCDetails:打印详细GC日志

  既然提到了弱引用,就顺便了解下:

  1. 强引用:不会被回收
  2. 软引用:内存不足时回收
  3. 弱引用:垃圾回收时立刻回收。

  再解释下GC日志。

-XX:+PrintGC
[GC 246656K->243120K(376320K), 0.0929090 secs]
[Full GC 243120K->241951K(629760K), 1.5589690 secs]

第一行的意思是进行了普通gc,已使用堆空间从246656K减小为243120K,当前可用的对空间为376320K,gc持续时间为0.0929090s。

引用类型 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时终止
软引用 内存不足时 对象缓存 内存不足时终止
弱引用 在垃圾回收时 对象缓存 gc运行后终止