เอารูปมาให้ดูเลย
จะได้ไม่โดนข้อหาแต่ง javascript :)

ภรรยาผมเดินผ่านมา เลยบังคับให้ทำด้วย
ผลลัพท์คุณเธอได้ 12 แต้ม
Javaเร็วส์, Javascript, Erlang, Python, Ruby, Clojure, Groovy, เลี้ยงลูก, วาดภาพ

SomeObject o = new SomeObject();
something.doSomethingWith (o);
WeakReference ref = new WeakReference (o);
o = null;
assertGC ("Object still referenced", ref);
public static void assertGC(String text, java.lang.ref.Reference ref) {
ArrayList alloc = new ArrayList ();
int size = 100000;
for (int i = 0; i < 50; i++) {
if (ref.get() == null) {
return;
}
System.gc();
System.runFinalization();
try {
alloc.add (new byte[size]);
size = (int)(((double)size) * 1.3);
} catch (OutOfMemoryError error) {
size = size / 2;
}
try {
if (i % 3 == 0) Thread.sleep(321);
} catch (InterruptedException t) {
// ignore
}
}
alloc = null;
fail(text + ":\n" + findRefsFromRoot(ref.get()));
}
private static String findRefsFromRoot(final Object target) {
final Map objects = new IdentityHashMap();
boolean found = false;
Visitor vis = new Visitor() {
public void visitClass(Class cls) {}
public void visitObject(ObjectMap map, Object object) {
objects.put(object, new Entry(object));
}
public void visitArrayReference(ObjectMap map, Object from, Object to, int index) {
visitRef(from, to);
}
public void visitObjectReference(ObjectMap map, Object from, Object to, java.lang.reflect.Field ref) {
visitRef(from, to);
}
private void visitRef(Object from, Object to) {
((Entry)objects.get(from)).addOut(to);
((Entry)objects.get(to)).addIn(from);
if (to == target) throw new RuntimeException("Done");
}
public void visitStaticReference(ObjectMap map, Object to, java.lang.reflect.Field ref) {
((Entry)objects.get(to)).addStatic(ref);
if (to == target) throw new RuntimeException("Done");
}
};
try {
ScannerUtils.scanExclusivelyInAWT(ScannerUtils.skipNonStrongReferencesFilter(), vis, ScannerUtils.interestingRoots());
} catch (Exception ex) {
// found object
found = true;
}
if (found) {
return findRoots(objects, target);
} else {
return "Not found!!!";
}
}
public class MyFrame extends javax.swing.JFrame {
MenuAction menuAction = new MenuAction();
public MyFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBounds (20, 20, 300, 300);
getContentPane().addMouseListener (new MouseAdapter() {
public void mouseReleased (MouseEvent me) {
getPopupMenu().show((Component) me.getSource(), me.getX(), me.getY());
}
});
}
JPopupMenu getPopupMenu() {
JPopupMenu menu = new JPopupMenu();
menu.add (new JMenuItem (menuAction));
return menu;
}
static final class MenuAction extends AbstractAction {
public MenuAction() {
putValue (Action.NAME, "Do Something");
}
public void actionPerformed (ActionEvent ae) {
System.out.println("Action performed");
}
}
}
Testcase: testLeak(javaapplication7.MyFrameTest): FAILED
Popup menu should have been collected:
private static java.awt.Component java.awt.KeyboardFocusManager.focusOwner->
javaapplication7.MyFrame@d1e89e->
javaapplication7.MyFrame$MenuAction@f17a73->
javax.swing.event.SwingPropertyChangeSupport@3526b0->
javax.swing.event.EventListenerList@3ddcf1->
[Ljava.lang.Object;@105c1->
javax.swing.JMenuItem$1@f74864->
javax.swing.JMenuItem@110003->
javax.swing.JPopupMenu@627086
sudo umount /Volumns/KNOPPIX
sudo dd if=/dev/disk1s0 of=/tmp/testimage.img bs=2048
qemu -cdrom /tmp/testimage.img -pci -m 512 -k en-us -boot d


<bean id="myValidator" class="org.springmodules.validation.ValangValidatorFactoryBean">
<property name="valang"><value><![CDATA[
{ age : age is not null : 'Age is a required field.' }
{ age : age is null or age >= 18 : 'Customers must be 18 years or older.' }
{ valueDate : valueDate is not null : 'Value date is a required field.' }
{ valueDate : valueDate is null or (valueDate >= [Td] > valueDate) :
'Value date must be today.' }
{ firstName : firstName has text : 'First name is a required field.' }
{ firstName : firstName has no text or length(firstName) <= 50 :
'First name must be no longer than 50 characters.' }
{ size : size has length : 'Size is a required field.' }
{ size : size has no length or upper(size) in 'S', 'M', 'L', 'XL' :
'Size must be either S, M, L or XL.' }
{ lastName : lastName has text and !(false) = true :
'Last name is required and not false must be true.' }
]]></value></property>
</bean>
We started developping using all the nice technologies we know: Servlet/JSP, Struts, Spring DAOs, Hibernate.
But we experienced painful problems and the learning curve was hard.
Between you and me, if we had to do it again in the same conditions, I may not use Hibernate, neither Spring transactions, and probably something else than Struts (maybe PhP ? oups, I've said it !). We'll publish an article later end May and explain how these painful layers have been useful sometimes.
Java is fast and scallable when used right.
Unfortunatelly, Java developers quite often over-engineer, over-design, over-layer, over-hype, over-complicate...
