Quand on tape la commande java MaClass.java
Automatiquement la JVM met environ 750 classes en mémoire pour pouvoir l'exécuter.
Est-il possible que la JVM commence avec 0 classes et qu'elle les charge quand c'est nécessaire?
Merci
Quand on tape la commande java MaClass.java
Automatiquement la JVM met environ 750 classes en mémoire pour pouvoir l'exécuter.
Est-il possible que la JVM commence avec 0 classes et qu'elle les charge quand c'est nécessaire?
Merci
C'est déjà le cas ; vois Consumer JRE: Leaner, Meaner Java Technology.
tu le met dans un jar:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 import java.lang.instrument.Instrumentation; public class SimpleMain { public static void premain(String agentArguments, Instrumentation instrumentation) { System.out.println(instrumentation.getAllLoadedClasses().length); } }
tu ajoute dans le manifest:
Code : Sélectionner tout - Visualiser dans une fenêtre à part jar -cvf test.jar SimpleMain.class
tu exécute l'agent tout seul avec la commande:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Premain-Class: SimpleMainrésultat 394 classes sont déjà lu dans la JVM
Code : Sélectionner tout - Visualiser dans une fenêtre à part java -javaagent:test.jar
De quelles classe s'agit il? Normalement il devrait seulement s'agir des classes nécessaire au fonctionnement de ton application.
C'est peut-être bête comme remarque, mais ce qu'il te retourne tient compte des classes chargées pour exécuter ton SimpleMain ? Si oui alors pour exécuter println() il doit charger quelques classes
il faudrait afficher les classes, mais vu que ta jvm est démarrée, t'as déjà toutes les classes associées au fonctionnement du GC qui doivent etre présente, toutes les classes liées à l'instrumentation, celles liées aux singletons System.out/err, indirectement celles liées aux classloader et l'exploration de jars, ...
Sans compter que ca prend vraisemblablement en compte les classes privées et les inner classes, qui foisonnent vite.
Quelque part, ce serait un peux comme s'étonner que pour charger les librairies et ton programme en C, le système a déjà fait 300 mallocs
Faudrais voir aussi si ta JVM est récente
voilà chez moi la liste des classes chargées:
Comme tu peux voir on y trouve:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349 java.lang.ClassCastException sun.reflect.LangReflectAccess java.util.Collections$EmptySet sun.misc.SignalHandler java.util.LinkedHashMap$Entry java.util.Properties java.util.Arrays java.lang.Iterable java.util.Hashtable$EmptyEnumerator sun.reflect.Reflection sun.reflect.FieldAccessorImpl sun.misc.MetaIndex java.lang.Integer java.util.Set java.util.concurrent.atomic.AtomicReferenceFieldUpdater java.util.RandomAccess sun.nio.cs.UTF_8$Encoder java.lang.VirtualMachineError [Ljava.lang.VirtualMachineError; java.lang.Runtime sun.nio.cs.Unicode sun.security.provider.PolicyFile java.util.concurrent.locks.ReentrantLock$NonfairSync java.nio.charset.CharsetDecoder sun.nio.cs.HistoricallyNamedCharset java.io.ExpiringCache$Entry java.util.concurrent.ConcurrentMap java.security.BasicPermissionCollection java.util.Comparator java.io.Closeable java.lang.Thread [Ljava.lang.Thread; sun.nio.cs.UTF_8 java.io.Serializable [Ljava.io.Serializable; java.util.AbstractList java.lang.instrument.Instrumentation java.lang.Terminator java.lang.ThreadLocal java.security.Principal [Ljava.security.Principal; sun.net.www.protocol.file.FileURLConnection sun.instrument.TransformerManager$TransformerInfo [Lsun.instrument.TransformerManager$TransformerInfo; java.util.Collections$SynchronizedMap java.lang.Exception sun.misc.Launcher$ExtClassLoader java.security.Permission java.net.UnknownContentHandler java.nio.charset.CoderResult sun.misc.URLClassPath$Loader sun.reflect.MethodAccessor java.net.URLConnection sun.jkernel.DownloadManager$1 java.io.ObjectStreamField [Ljava.io.ObjectStreamField; java.lang.System java.util.concurrent.ConcurrentHashMap java.lang.OutOfMemoryError [Ljava.lang.OutOfMemoryError; java.util.BitSet java.io.FileDescriptor java.lang.Math java.util.Collections$EmptyList sun.reflect.ReflectionFactory java.security.Guard java.util.concurrent.ConcurrentHashMap$HashEntry [Ljava.util.concurrent.ConcurrentHashMap$HashEntry; java.lang.ref.Reference$Lock java.lang.ThreadGroup [Ljava.lang.ThreadGroup; java.lang.Byte sun.reflect.misc.ReflectUtil sun.net.www.ParseUtil sun.reflect.DelegatingClassLoader java.security.SecureClassLoader java.lang.Double java.lang.Readable sun.nio.cs.StandardCharsets java.lang.IncompatibleClassChangeError sun.misc.AtomicLong sun.reflect.ConstantPool java.io.FileInputStream java.nio.charset.CodingErrorAction java.util.StringTokenizer java.util.Stack java.util.Map$Entry [Ljava.util.Map$Entry; java.lang.Long java.nio.Bits java.io.FilterInputStream sun.reflect.MethodAccessorImpl java.lang.ref.ReferenceQueue$Null sun.reflect.UnsafeStaticFieldAccessorImpl java.util.concurrent.locks.AbstractQueuedSynchronizer java.lang.InternalError java.lang.StackTraceElement [Ljava.lang.StackTraceElement; java.util.Collections java.lang.Character sun.reflect.ConstructorAccessorImpl sun.misc.URLClassPath$FileLoader sun.misc.URLClassPath$FileLoader$1 java.lang.NoSuchMethodError java.util.Vector java.lang.RuntimePermission java.lang.ref.SoftReference java.util.Dictionary sun.misc.OSEnvironment sun.misc.SharedSecrets java.util.HashMap sun.misc.SoftCache java.lang.Class$1 java.lang.StackOverflowError sun.reflect.ReflectionFactory$GetReflectionFactoryAction java.security.ProtectionDomain java.util.List sun.instrument.InstrumentationImpl$1 java.lang.LinkageError sun.net.www.MessageHeader java.lang.StringCoding java.lang.reflect.Member [Ljava.lang.reflect.Member; java.lang.reflect.Type [Ljava.lang.reflect.Type; sun.misc.Signal java.io.FileReader sun.misc.JavaLangAccess java.io.ExpiringCache java.io.OutputStream java.lang.ref.Finalizer$FinalizerThread sun.instrument.InstrumentationImpl java.net.URLClassLoader$7 sun.misc.Launcher$AppClassLoader java.lang.ref.ReferenceQueue java.lang.Appendable sun.net.www.protocol.file.Handler java.io.PrintStream java.lang.ClassLoader$3 sun.misc.JavaNetAccess java.security.AccessControlContext java.util.HashSet java.io.FileSystem java.nio.charset.CoderResult$Cache java.io.ExpiringCache$1 java.lang.reflect.AccessibleObject [Ljava.lang.reflect.AccessibleObject; java.lang.Error [Ljava.lang.Error; java.lang.Boolean java.util.AbstractMap java.lang.RuntimeException java.net.URLStreamHandlerFactory java.util.Collection java.security.AccessController java.util.Hashtable$EmptyIterator java.lang.Number java.lang.ref.FinalReference java.io.BufferedInputStream java.lang.Runnable [Ljava.lang.Runnable; java.lang.ThreadLocal$ThreadLocalMap$Entry [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry; java.io.OutputStreamWriter java.lang.reflect.ReflectAccess java.security.BasicPermission java.security.PrivilegedActionException java.io.FileOutputStream sun.misc.URLClassPath$JarLoader java.util.Hashtable$Entry [Ljava.util.Hashtable$Entry; java.lang.ClassLoader java.lang.StringCoding$StringDecoder java.lang.Class$3 java.lang.CharSequence [Ljava.lang.CharSequence; java.util.Enumeration java.util.concurrent.locks.ReentrantLock [Ljava.util.concurrent.locks.ReentrantLock; java.lang.Float sun.net.www.protocol.jar.Handler sun.nio.cs.FastCharsetProvider sun.reflect.NativeMethodAccessorImpl java.lang.ref.Reference$ReferenceHandler java.nio.CharBuffer java.lang.Object [Ljava.lang.Object; java.nio.ByteOrder sun.reflect.ReflectionFactory$1 java.lang.Cloneable java.io.FilePermissionCollection java.net.URLClassLoader sun.jkernel.DownloadManager java.lang.ref.PhantomReference java.io.Writer java.lang.String [Ljava.lang.String; sun.misc.URLClassPath java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl java.lang.Terminator$1 sun.net.www.URLConnection java.io.FilePermission java.net.Parts sun.nio.ByteBuffered java.nio.HeapCharBuffer java.util.Hashtable java.lang.Compiler sun.misc.Launcher$ExtClassLoader$1 test.SimpleMain java.security.PrivilegedAction sun.misc.NativeSignalHandler java.security.PermissionCollection java.io.InputStreamReader java.lang.StringBuffer java.net.URLStreamHandler java.lang.Compiler$1 sun.nio.cs.StandardCharsets$Cache java.util.Collections$EmptyMap java.nio.ByteBuffer java.lang.StringCoding$StringEncoder java.security.Policy java.lang.ArithmeticException java.net.URLClassLoader$1 java.lang.reflect.Method [Ljava.lang.reflect.Method; java.io.Reader java.lang.NoClassDefFoundError java.util.concurrent.locks.Lock [Ljava.util.concurrent.locks.Lock; java.lang.reflect.Array java.util.ArrayList java.lang.reflect.GenericDeclaration [Ljava.lang.reflect.GenericDeclaration; java.lang.Comparable [Ljava.lang.Comparable; java.lang.ThreadLocal$ThreadLocalMap java.lang.AbstractStringBuilder java.lang.ref.ReferenceQueue$Lock sun.security.action.GetPropertyAction java.lang.StringBuilder sun.nio.cs.StreamDecoder sun.security.util.Debug sun.nio.cs.StreamEncoder sun.reflect.MagicAccessorImpl java.security.UnresolvedPermission java.util.concurrent.locks.AbstractOwnableSynchronizer java.security.Permissions java.lang.Package sun.misc.AtomicLongCSImpl java.util.LinkedHashMap java.nio.charset.Charset java.util.concurrent.atomic.AtomicInteger java.lang.NullPointerException java.net.ContentHandler java.lang.reflect.AnnotatedElement [Ljava.lang.reflect.AnnotatedElement; java.io.FilePermission$1 java.io.File [Ljava.io.File; java.io.BufferedOutputStream java.lang.reflect.Field [Ljava.lang.reflect.Field; java.lang.ClassNotFoundException java.lang.Throwable [Ljava.lang.Throwable; java.lang.StringValue java.security.CodeSource java.security.cert.Certificate [Ljava.security.cert.Certificate; java.nio.charset.CoderResult$2 sun.reflect.FieldAccessor sun.reflect.DelegatingConstructorAccessorImpl java.util.HashMap$Entry [Ljava.util.HashMap$Entry; java.nio.charset.spi.CharsetProvider java.io.ObjectStreamClass java.lang.System$2 sun.reflect.NativeConstructorAccessorImpl java.nio.Buffer sun.misc.Resource java.lang.ref.Finalizer sun.misc.Launcher$AppClassLoader$1 sun.nio.cs.StandardCharsets$Classes java.lang.CharacterDataLatin1 java.lang.ThreadDeath java.util.Map sun.misc.Unsafe java.lang.SystemClassLoaderAction java.io.UnixFileSystem java.util.concurrent.ConcurrentHashMap$Segment [Ljava.util.concurrent.ConcurrentHashMap$Segment; sun.nio.cs.UTF_8$Decoder java.util.Iterator java.net.URL [Ljava.net.URL; java.lang.reflect.Constructor [Ljava.lang.reflect.Constructor; java.security.Policy$UnsupportedEmptyCollection sun.jkernel.DownloadManager$2 java.security.PrivilegedExceptionAction java.util.Collections$ReverseComparator java.lang.Short sun.util.PreHashedMap sun.reflect.UnsafeFieldAccessorImpl java.io.InputStream java.security.AllPermission java.io.BufferedWriter sun.misc.Launcher$Factory sun.misc.Launcher java.lang.ArrayStoreException java.lang.reflect.ReflectPermission java.io.Flushable java.util.AbstractSet java.io.FilterOutputStream java.util.concurrent.locks.AbstractQueuedSynchronizer$Node java.lang.ref.WeakReference [Ljava.lang.ref.WeakReference; java.util.Locale java.lang.ref.Reference [Ljava.lang.ref.Reference; sun.reflect.DelegatingMethodAccessorImpl java.nio.charset.CoderResult$1 java.nio.HeapByteBuffer java.lang.String$CaseInsensitiveComparator java.lang.Class [Ljava.lang.Class; sun.misc.VM sun.misc.URLClassPath$3 sun.nio.cs.StandardCharsets$Aliases sun.reflect.ConstructorAccessor java.nio.charset.CharsetEncoder java.lang.reflect.Modifier java.util.AbstractCollection java.lang.ClassLoader$NativeLibrary sun.instrument.TransformerManager java.lang.Thread$UncaughtExceptionHandler [Ljava.lang.Thread$UncaughtExceptionHandler; java.io.BufferedReader sun.misc.Version java.lang.IllegalMonitorStateException java.util.concurrent.locks.ReentrantLock$Sync [Z [B [C [I [S [J [F [D
-les types de bases
-l'instrumentation
-les classloader
-la sécurité car elle est utilisée par le classloader
-les charset(faut bien savoir écrire)
-des inner classes
-quelques collections
-tous les throwables déclarés par les classes utilisées
-des classes liées aux threads et la synchro
-les classes de sun
rien d'anormal en somme
J'ai 349 classes chargées. Si je fais un SimpleMain.class.forName("javaw.swing.JFrame"), je passe à 451, soit une centaines de classes chargées juste pour accéder à JFrame, et ca met un quart de poil de seconde
Donc moi mon but c'est de faire de l'instrumentation de classe au moment ou elles sont chargées mais avant que j'ai le temps de les instrumenter, elles sont déjà chargées dans la JVM.
Est ce que quelqu'un a une idée pour instrumenter les classes déjà chargées.
l'étape d'après dans mon SimpleMain c'est :
instrumentation.addTransformer(new SimpleTransformer( ) );
Voila le ClassFileTransformer qui modifie toutes les classes qui sont lue par la suite.
J'imagine que c'est l'instruction super() de mon constructeur qui fait chargé 350classes d'un coup.
Enfin c'est inévitable donc il faut que je fasse un retransform sur les classes déjà lu.
Donc évidement ca fonctionne pas. Le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public class SimpleTransformer2 implements ClassFileTransformer { Instrumentation instrum; public SimpleTransformer2(Instrumentation i) { super(); instrum = i; try{ Class[] cl = instrum.getAllLoadedClasses(); for(int a=0;a<cl.length;a++){ if(instrum.isModifiableClass(cl[a])){ instrum.retransformClasses(cl[a]); System.out.println("modifiable :"+cl[a].getName()); }else{ System.out.println("pas modifiable :"+cl[a].getName()); } } }catch(Exception e){ e.printStackTrace(); } } public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException { System.out.println("Modifying: " + className); byte[] result = bytes; try { [ . . mon instrumentation . . ]
au début de la méthode public byte[] transform( ... ) m'indique le nom des classes qui sont modifiées mais les classes déjà lues ne passe pas par cette méthode malgré le
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.println("Modifying: " + className);fait dans le constructeur du ClassFileTransformer
Code : Sélectionner tout - Visualiser dans une fenêtre à part instrum.retransformClasses(cl[a]);
Salut,
Il ne manquerait pas un Can-Retransform-Classes ou un Can-Redefine-Classes dans ton manifest ???
Source : http://javasearch.developpez.com/j2s...e-summary.html
a++
merci
effectivement avec :
dans le manifest ca fonctionne mieux. Merci pour l'info
Code : Sélectionner tout - Visualiser dans une fenêtre à part Can-Retransform-Classes: true
Mais je n'arrive toujours pas a instrumenter les classes :
java/lang/String
java/lang/Integer
etc ...
Est ce qu'il y a un moyen?
De plus, lors de mon premier test : instrum.isModifiableClass(cl[a])
Les classes String etc ... se disent modifiable.
Quelqu'un a une idée
grace à
Can-Retransform-Classes: true
dans le manifest je retransform 16 classes sur les 300 chargés au démarrage.
peut être faut-il fait carrément faire un
Instrumentation. redefineClasses(ClassDefinition[] definitions)
le probleme c'est pour le ClassDefinition :
public ClassDefinition(Class<?> theClass, byte[] theClassFile)
- Creates a new ClassDefinition binding using the supplied class and class file bytes. Does not copy the supplied buffer, just captures a reference to it.
Parameters:
theClass - the Class that needs redefining
theClassFile - the new class file bytes
pour avoir le byte[] "theClassFile" il faut que j'appel la méthode transform qui me permet d'avoir un nouveau byte[] qui est en fait ma classe instrumenté.
mais seulement le transform il faut lui donner tout ces paramètres :
Et je sais pas comment faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException
désolé en fait le fait de rajouter l'option ne m'a rien fait gagner.
J'ai commenté le code instrum.retransformClasses(cl[a]);
et ca me donne le même résultat.
Je n'ai toujours pas réussir à retransformer les classes déjà lu par la JVM.
Pourtant je suis sure que c'est possible
voila ce que j'ai décidé de faire:
au lieu de faire un retransform je fais un redefine.
seulement je n'arrive pas lui envoyer le dernier paramètre
classfileBuffer - the input byte buffer in class file format - must not be modified
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Class[] cl = instrum.getAllLoadedClasses(); int nb = 0; for(int a=0;a<cl.length;a++){ if(instrum.isModifiableClass(cl[a])){ ClassDefinition cl2 = new ClassDefinition(cl[a],this.transform(ClassLoader.getSystemClassLoader(),cl[a].getName(), cl[a], cl[a].getProtectionDomain(), /* byte[] classfileBuffer comment je fais pour l'avoir???*/ )); } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager