Java内存区Q:Java虚拟机规范将JVM虚拟机管理的内存分为几部分?如果是选择题,估计会有一些没记进去的,比如直接记忆。A:程序计数器、java虚拟机栈、本地方法栈、方法区、堆。java对象在内存中的分配:§GC策略Q:Java使用rootsearch算法来判断一个对象是否在stock中,哪些对象可以作为GCRoots?A:虚拟机栈中的引用对象(栈帧中的局部变量表)JNI(Nativemethod)在本地方法栈中的引用对象:标记清除、标记整理、复制算法是哪个块?A:复制算法更快。三种算法的含义如下:Q:SerialOld使用的是什么算法?A:标记排序算法属于处理老年代的算法。各个收藏家的变化图如下,主要关注变化和差异。Q:fullGC会发生在老年代区还是新生代区?A:会发生在老年代区。相反,minorGC一般是在新生代区发送。新生代、老年代、minorGC、fullGC的发生过程如下:Q:方法区的类对象(即类对象)什么时候被回收?A:所有的实例都被回收了,对应的classLoader也被回收了,class对象将不再被引用和反射(这个怎么确定?我在书上看过,但是没看懂)§finalized和GCQ:什么时候调用对象的finalized?方法A:当JVM开始垃圾回收,对象要被回收时。定稿应该更多的是一个规范。很多规范要求我们不要自己敲定,毕竟不确定性太大。§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最大内存问:如果不设置,-Xms和-Xmx的默认大小分别是多少?A:如果不设置,两者相等,默认为物理内存/64(小于1G)Q:用于配置新生代内存大小的最大值为:()你问我的内存是多少新一代?如下,1个E区加2个S区的内存大小A:-Xmn。-X、memory、new类似于-XX:NewSize和-XX:MaxNewSize。Q:如何根据以上参数计算出老年代的内存大小?A:Xmx的值(堆的最大值)-Xmn的值(新生代内存)Q:()用来配置线程栈内存的是什么?替代参数是什么?答:-XSS。另一个是-XX:ThreadStackSize-Xss意思是-Xstacksize有以下3个gc相关的参数-Xnoclassgc-Xincgc-Xloggc:file回答下面的问题:问:可以用来关闭类对象的gc功能吗?()可以用来减少gc的程序停顿时间()可以用来输出gc相关的日志()A:可以用来关闭类对象的gc功能(-Xnoclassgc)可以用减少gc的程序停顿时间(-Xincgc)用于输出gc相关的日志(-Xloggc:file)问:-verbose一般用来做什么?A:查询gc问题。-verbose:class输出jvm加载的类的相关信息。当jvm报找不到类或者类冲突时,就可以诊断了。-verbose:gc输出每次GC的相关信息,后面会详细介绍。-verbose:jni输出native方法调用的相关信息,一般用于诊断jni调用错误信息。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,默认几乎无限大
