一、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
下面看一些具体的设置:
- -Xms Java Heap初始值。
- -Xmx Java Heap最大值。
- -Xmn Java Heap Young区大小。
- -Xss 每个线程栈的大小。
- -XX:InitialCodeCacheSize:初始代码缓存区大小
- -XX:ReservedCodeCacheSize:保留的代码缓存区大小
- -XX:+UseConcMarkSweepGC:设置老年代并发收集
- -XX:SoftRefLRUPolicyMSPerMB=50:还没搞的十分懂,和软引用有关。
- -XX:+PrintGC:打印GC日志
- -XX:PrintGCDetails:打印详细GC日志
既然提到了弱引用,就顺便了解下:
- 强引用:不会被回收
- 软引用:内存不足时回收
- 弱引用:垃圾回收时立刻回收。
再解释下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运行后终止 |