JVM模型

JVM笔记

虚拟机栈:一个线程一个栈,一个方法一个栈帧
堆:放对象的,占用内存最大的

堆内存

JVM笔记

1、新生代(New| Young):
○ eden:新new出来的对象存在这里,特别大的放在老年代(old)里
○ surivivi(有 2块一模一样的空间s0,s1):幸存者(被垃圾回收之后,还活着),即new 出来的对象, 在GC时还在被对象引用,这是就会把new的对象移到其中一个。
执行过程:
a. 假设这里第一次GC 没有回收的new对象移动在s0,
b. 那么第二GC时会把S0复制到S1,然后把eden区没有回收的对象移到s1,然后S0被回收清空
c. 第三次GC时再把把S1复制到S0,然后把eden区没有回收的对象移到s0,然后S1被回收清空
如此往复,相互转换,永远保持一个S0|S1是空的、干净的…..
有的叫from区和to区,from和to角色互相转换,或者叫S0和S1

一直不死的即多次GC后, 就会转移到老年代

2、老年代(old):tenured:终生制的

GC使用

垃圾收集算法:

  1. Mark-Sweep标记清处

    缺点:内存不连续,内存碎片化,特别大对象需要连续内存时没有内存可用,这是会产生fullGC,内存压缩,腾出空间给大对象使用

JVM笔记

  1. Copying复制

    缺点:内存浪费、永远只用一半,即4G只能用2G
    JVM笔记

  2. Mark-Compact标记压缩

    效率比copy低
    JVM笔记

如何确定垃圾

引用分为:强、软、弱、虚
确定垃圾:
○ 引用计数:会有循环引用的问题
○ 正向可达:从roots对象计算可以到达的对象

String s = new String(“test);
new了个对象test
s=null;
此时test没有被引用,所以是垃圾
此外还有:
○ 循环引用 = 一堆垃圾
○ 2个对象互相调用 = 一对垃圾

JVM采用分代算法
● new|young:存活对象少,使用copying,占用内存空间也不大,效率也高
● old:垃圾少,一般使用mark-compacr算法

JAVA对象的分配(需要开启栈上的优化,默认开启)
执行顺序:
○ 栈上分配(放在栈里,栈帧方法执行完就没了,不用GC,效率极高)
■ 线程私有小对象(虚拟机自动调整)
■ 无逃逸
■ 支持标量替换
■ 无需调整
○ 线程本地分配TLAB(Thread Local Allacation Buffer 即在eden中申请自己的空间、特别小)
■ 占用eden,默认1%
■ 多线程的时候不用竞争eden就可以申请空间,提高效率
■ 小对象
■ 无需调整
○ 老年代
■ 大对象(可以自己设置多大的对象为大对象,大对象直接放在老年代)
○ eden

JVM中的垃圾收集器
○ Serial Collector
■ XX:+UseSerialGC
■ 单线程
○ Paraller Collector
■ 并发量大,不过每次垃圾需要JVM需要停顿,GC完才可以继续运行
○ CMS Collector
■ 停顿时间短,GC可以继续运行
○ G1
■ 不仅停顿时间短,同时并发大,GC可以继续运行

JVM设置参数
■ 提示参数前-是不使用 +是使用
■ - 标准参数,所有的JVM都应该支持
■ -X 非标,每个JVM实现都不同
■ -XX 不稳定参数,下一个版本可能会取消

常用设置
a. 堆设置
■ -Xms :初始堆大小
■ -Xmx :最大堆大小
■-Xmn:设置年轻代大小为 2G。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。
■-Xss: 设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成, 经验值在 3000~5000 左右。
■ -XX:NewSize=n :设置年轻代大小
■ -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
■ -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
■ -XX:MaxPermSize=n :设置持久代大小
■-XX:MaxTenuringThreshold:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。
b. 收集器设置
■ -XX:+UseSerialGC :设置串行收集器
■ -XX:+UseParallelGC :设置并行收集器
■ -XX:+UseParalledlOldGC :设置并行年老代收集器
■ -XX:+UseConcMarkSweepGC :设置并发收集器
c. 垃圾回收统计信息
■ -XX:+PrintGC
■ -XX:+PrintGCDetails
■ -XX:+PrintGCTimeStamps
■ -Xloggc:filename
d. 并行收集器设置
■ -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
■ -XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
■ -XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
e. 并发收集器设置
■ -XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。
■ -XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
f. 辅助打印信息
■ -XX:+PrintGC
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
■ -XX:+PrintGCDetails
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
■ -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
■ -XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
输出形式:Application time: 0.5291524 seconds
■ -XX:+PrintGCApplicationStoppedTime :打印垃圾回收期间程序暂停的时间。可与上面混合使用
输出形式:Total time for which application threads were stopped: 0.0468229 seconds
■ -XX:PrintHeapAtGC :打印GC前后的详细堆栈信息
■-Xloggc:filename :与上面几个配合使用,把相关日志信息记录到文件以便分析

Tomcat优化
catalina.bat 在头上设置
setlocal
set JAVA_OPTS=
-Xms2g
-Xmx2g
-Xss512k
-XX:+AggressiveOpts
-XX:+UseBiasedLocking
-XX:PermSize=64m
-XX:MaxPermSize=300m
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true

常用工具
内存文件的查看工具
VusualVM(在jdk中可以找到这个工具,%JAVA_HOME%\bin\jvisualvm.exe)
http://visualvm.java.net/zh_CN/gettingstarted.html
此外测试工具还有
Local Runner
Selenium
Jmeter

相关文章:

猜你喜欢
  • 2021-09-12
  • 2021-08-06
  • 2021-06-18
相关资源
相似解决方案