Java内存区域 Q:Java虚拟机规范将JVM虚拟机所管理的垃圾a垃内存分为几部分?如果是多选题,估计会给一些不在里面的回收,例如直接内存。收懂 A:程序计数器、垃圾a垃java虚拟机栈、回收本地方法栈、收懂方法区、垃圾a垃堆。回收 java对象在内存上的收懂分配: § GC策略 Q:java使用根搜索算法来确定对象是否存货,哪些对象可以作为GC Roots?垃圾a垃 A: Q:标记清除、标记整理、回收复制算法哪个块?收懂 A:复制算法较快。 3个算法含义如下: Q:SerialOld用的垃圾a垃是什么算法? A:标记整理算法,属于处理老年代算法。回收 各收集器的收懂变化图如下,主要关注一下变化和区别, Q:fullGC 会发生在老年代区还是新生代区? A: 会发生在老年代区。高防服务器相反,minorGC一般发送在新生代区。 新生代、老生代以及minorGC、fullGC的发生流程如下: Q:方法区里的class对象(即类对象)什么时候会被回收? A:所有实例都被回收、对应classLoader也被回收、class对象不会再被引用或者反射(这个咋确定?当初书里看到的,没懂) § finalized与GC Q:什么时候会调用对象的finalized方法 A:JVM启动垃圾回收,且该对象要被回收时。 finalized应该更多是规范吧,很多规范里都要求我们不要自己实现finalized了,毕竟不确定性太大。 § Java虚拟机GC参数配置 突然想起来当初看java虚拟机时,把那些参数给跳过了,感觉记不住。 但现在发现还是得学的,赶紧恶补一下。 Q: -client和-server的对比 ()启动较快 ()性能和内存管理效率高(注意启动快和性能好不是一回事) 桌面应用一般使用(), 服务器一般使用() A: (-clien)启动较快 (-server)性能和内存管理效率高 桌面应用一般使用(-clien), 服务器一般使用(-server) 有4个跟内存相关的参数 -Xmn -Xms -Xmx -Xss 回答下面的问题: Q: 用于配置java初始堆内存的是() A: -Xms。源码下载 -X、memory、size ,内存大小 Q: 用于配置java堆的最大值的是() A: -Xmx。 -X、memory、max 最大内存 Q:如果不设置,-Xms和-Xmx的大小分别默认是多少? A: 不设置的话,二者相等,默认是 物理内存/64(小于1G) Q:用于配置新生代内存大小的最大值是:() 你问我什么是新生代内存? 就是下面这个,1个E区加2个S区的这个内存大小 A: -Xmn。 -X、memory、new 相类似的还有-XX:NewSize 和 -XX:MaxNewSize。 Q:如何根据上面的参数计算老年代内存大小? A: Xmx的值(堆最大值)- Xmn的值(新生代内存) Q:用于配置线程栈内存的是()?替代的服务器托管还有哪个参数? A: -Xss。另一个是-XX:ThreadStackSize -Xss指 -X stack size 有下面3个和gc相关的参数 -Xnoclassgc -Xincgc -Xloggc:file 回答以下问题: Q: 可用于关闭针对类对象的gc功能的是() 可用于减少gc的程序停顿时间的是() 用于输出gc相关日志的是() A: 可用于关闭针对类对象的gc功能的是(-Xnoclassgc) 可用于减少gc的程序停顿时间的是(-Xincgc) 用于输出gc相关日志的是(-Xloggc:file) Q:-verbose 一般是用于什么的? A: 查询gc问题。 Q: -XX:PermSize和-XX:MaxPermSize设置的是什么内存? A: 方法区的内存。就是最开始那个图里的这个 通过配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据-XX:PermSize初始化分配一块连续的内存块,这样的话,如果-XX:PermSize设置过大,可能会很浪费。而Max如果设置小了,可能会omm。 Q:-XX:MetaspaceSize和-XX:MaxMetaspaceSize又是什么内存? A: 元数据区内存。java8引入的,用于替代上面的perm区。 无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,随着类加载越来越多不断扩容调整,直到MetaspaceSize(如果没有配置就是默认20.8m)触发FGC,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大